利用fcntl模块可以对一个文件加锁,其它python程序读取这个加锁文件时会阻塞,防止同时读写文件。
基本用法
flock(f, operation)
f: 文件描述符
operation: 操作
fcntl.LOCK_UN 解锁
fcntl.LOCK_EX 排他锁:除加锁进程外其他进程没有对已加锁文件读写访问权限。
fcntl.LOCK_SH 共享锁:所有进程没有写访问权限,即使是加锁进程也没有。所有进程有读访问权限。
fcntl.LOCK_NB 非阻塞锁:如果指定此参数,函数不能获得文件锁就立即返回,否则,函数会等待获得文件锁。
LOCK_NB可以同LOCK_SH或LOCK_NB进行按位或(|)运算操作:fcnt.flock(f,fcntl.LOCK_EX|fcntl.LOCK_NB)
flock锁的释放非常具有特色,即可调用LOCK_UN参数来释放文件锁,也可以通过关闭fd的方式来释放文件锁(flock的第一个参数是fd),意味着flock会随着进程的关闭而被自动释放掉。
示例代码
import fcntl
file_name = "/tmp/test.txt"
with open(file_name , 'r') as fr:
fcntl.flock(fr.fileno(), fcntl.LOCK_EX) # 加排它锁,加锁后只有当前进程可以读写文件,其它进程读写会阻塞
content = fr.read() # 文件内容
with open(file_name , 'w') as fw:
fw.write('123\n') # 写入内容
fcntl.flock(fr,fcntl.LOCK_UN) # 解锁(使用with上下文管理器结束也会自动解锁)