函数签名
fcntl.flock(f.fileno(), operation)
operation 的操作包括以下选项:
变量 | 名称 | 简介 |
---|---|---|
fcntl.LOCK_EX | 排他锁 | 其他进程没有读写访问权限 |
fcntl.LOCK_SH | 共享锁 | 所有进程都没有写权限(包括加锁进程),都有读权限 |
fcntl.LOCK_NB | 非阻塞锁 | 函数不能获得文件锁就立即返回,否则,等待获得文件锁 |
fcntl.LOCK_UN | 解锁 | 对加锁文件进行解锁 |
LOCK_NB可以同LOCK_SH或LOCK_NB进行按位或(|)运算操作
代码示例
# -*- coding: utf-8 -*-import fcntlimport timedef lock(f): fcntl.flock(f, fcntl.LOCK_EX | fcntl.LOCK_NB)def un_lock(f): fcntl.flock(f, fcntl.LOCK_UN)from multiprocessing import Processdef open_file(): f = open('test.txt', 'r') lock(f) # 加锁 print(f.read()) time.sleep(3) un_lock(f) f.close()Process(target=open_file).start()Process(target=open_file).start()
多进程情况下,如果一个进程给文件加锁了,另一个进程会报错,抛出异常