Python 给文件加锁--fcntl 模块

Python 给文件加锁–fcntl 模块

  • Linux下,Python的标准库有线程的文件锁,来自fcntl模块。这个模块提供了Unix系统fcntl()ioctl()的接口。

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):
    """
    目录下 读取文件
    :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):
    """
    目录下 写入文件
    :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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值