Python 给文件加锁--fcntl 模块

Python 给文件加锁–fcntl 模块

1. 前言

import fcntl  
  
打开一个文件  
# 当前目录下test文件要先存在,如果不存在会报错。或者以写的方式打开  
f = open('./test')  
# 对该文件加锁:  
fcntl.flock(f,fcntl.LOCK_EX)  
# 这样就对文件test加锁了,如果有其他进程对test文件加锁,则不能成功,会被阻塞,但不会退出程序。  
# 解锁:
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. 示例

  1. 读文件
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
  1. 写文件
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)

你可能感兴趣的:(python)