FreezeJ' Blog

python3文件锁fcntl

2021-02-21

利用fcntl模块可以对一个文件加锁,其它python程序读取这个加锁文件时会阻塞,防止同时读写文件。

官方文档:https://docs.python.org/zh-cn/3.7/library/fcntl.html

基本用法

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上下文管理器结束也会自动解锁)
Tags: Python