什么是 portalocker
portalocker 是一个功能强大的 Python 库,用于在不同操作系统(Windows、Linux、macOS)之间实现跨平台的文件锁定。
在多进程或多线程环境下,当多个进程尝试同时写入同一个文件时,可能会导致数据损坏或竞争条件,Python 原生的文件操作在不同操作系统上的锁定机制差异巨大(Windows 使用 msvcrt,Unix 使用 fcntl),而 portalocker 提供了一套统一的 API,屏蔽了底层的实现差异,使得文件锁定变得简单且安全。
安装方法
你可以通过 pip 轻松安装该库:
pip install portalocker
核心功能与用法
使用上下文管理器(推荐)
这是最 Pythonic 的使用方式,通过 with 语句,可以确保文件在操作完成后自动解锁,即使在发生异常时也能保证文件句柄被正确关闭和释放。
import portalocker
# 以追加模式打开文件
with open('example.txt', 'a') as f:
# 尝试获取独占锁 (Exclusive Lock)
# 如果文件已被锁定,代码会阻塞直到获取到锁
with portalocker.Lock(f, mode='wb'):
f.write('这是一行被保护的数据n')
非阻塞锁定
如果你不希望程序在等待锁时被长时间阻塞,可以使用 非阻塞模式,如果无法立即获取锁,程序会抛出 portalocker.exceptions.LockException 异常,你可以根据此异常进行自定义处理。
import portalocker
try:
with open('example.txt', 'a') as f:
# 使用 flags 参数设置非阻塞模式
with portalocker.Lock(f, flags=portalocker.LOCK_EX | portalocker.LOCK_NB):
f.write('仅当能够立即获取锁时才写入n')
except portalocker.exceptions.LockException:
print('无法获取文件锁,文件正被其他进程占用')
锁定类型
portalocker 主要支持以下几种锁定标志:
- portalocker.LOCK_EX: 独占锁,同一时间只允许一个进程持有,通常用于写入操作。
- portalocker.LOCK_SH: 共享锁,允许多个进程同时持有,通常用于读取操作。
- portalocker.LOCK_NB: 非阻塞标志,通常与其他标志按位或(|)使用,防止进程因等待锁而挂起。
为什么选择 portalocker
- 跨平台一致性:无需编写复杂的
if os.name == 'nt'判断逻辑,一套代码即可在 Windows 和 Linux 上运行。 - 易于集成:支持标准的 Python 文件对象,可以无缝集成到现有的文件 I/O 流程中。
- 健壮性:内置了对文件描述符的处理,能够有效防止因程序崩溃导致的文件锁死问题。
注意事项
- 仅限本地文件系统:portalocker 依赖于操作系统的文件锁定机制,因此它不适用于网络文件系统 (NFS/SMB) 或分布式存储系统,在这些环境下,文件锁定机制通常不可靠或根本不支持。
- 进程间通信:此库主要用于处理文件级别的并发,不应将其用作进程间通信(IPC)的通用同步原语。
- 文件句柄:请确保在锁定期间文件句柄保持打开状态,如果文件句柄被关闭,锁也会随之释放。
首发原创文章,作者:世雄 - 原生数据库架构专家,如若转载,请注明出处:https://idctop.com/article/491770.html



