Python 给文件加锁–fcntl 模块
1. 前言
import fcntl
打开一个文件
f = open('./test')
fcntl.flock(f,fcntl.LOCK_EX)
fcntl.flock(f,fcntl.LOCK_UN)
2. 模块方法
fcntl模块:
flock() : flock(f, operation)
operation : 包括:
fcntl.LOCK_UN 解锁
fcntl.LOCK_EX 排他锁
fcntl.LOCK_SH 共享锁
fcntl.LOCK_NB 非阻塞锁
1. LOCK_SH 共享锁:
所有进程没有写访问权限,即使是加锁进程也没有。所有进程有读访问权限。
2. LOCK_EX 排他锁:
除加锁进程外其他进程没有对已加锁文件读写访问权限。
3. LOCK_NB 非阻塞锁:
如果指定此参数,函数不能获得文件锁就立即返回,否则,函数会等待获得文件锁。
4. LOCK_NB可以同LOCK_SH或LOCK_NB进行按位或(|)运算操作。 fcnt.flock(f,fcntl.LOCK_EX|fcntl.LOCK_NB)
3. 示例
- 读文件
def read_file(file_name):
"""
temp目录下 读取临时文件
:param file_name: 文件名
"""
file_path = f"文件路径"
if not os.path.exists(file_path):
return ""
with open(file_path, "r", encoding='utf8') as f:
fcntl.flock(f.fileno(), fcntl.LOCK_SH)
contents = f.read()
fcntl.flock(f.fileno(), fcntl.LOCK_UN)
return contents
- 写文件
def write_file(file_name, info):
"""
temp目录下 写入临时文件
:param file_name: 文件名
:param info: 写入文件内容
"""
file_path = f"文件路径"
with open(file_path, 'w', encoding='utf8') as f:
fcntl.flock(f.fileno(), fcntl.LOCK_EX)
if not isinstance(info, str):
info = json.dumps(info, ensure_ascii=False)
f.write(info)
fcntl.flock(f.fileno(), fcntl.LOCK_UN)