fcntl模块:
flock() : flock(f, operation)
operation : 包括:
fcntl.LOCK_UN 解锁
fcntl.LOCK_EX 排他锁
fcntl.LOCK_SH 共享锁
fcntl.LOCK_NB 非阻塞锁
LOCK_SH 共享锁:所有进程没有写访问权限,即使是加锁进程也没有。所有进程有读访问权限。
LOCK_EX 排他锁:除加锁进程外其他进程没有对已加锁文件读写访问权限。
LOCK_NB 非阻塞锁:
如果指定此参数,函数不能获得文件锁就立即返回,否则,函数会等待获得文件锁。
LOCK_NB可以同LOCK_SH或LOCK_NB进行按位或(|)运算操作。 fcnt.flock(f,fcntl.LOCK_EX|fcntl.LOCK_NB)
实例:
# !/usr/bin/python
# -*- encoding=utf8 -*-
import sys
import time
import fcntl
class FLOCK(object):
def __init__(self, name, wait):
self.name = name
self.wait = wait
def lock_unlock(self):
try:
with open(self.name, 'r+') as f:
# fcntl.lockf(f, fcntl.LOCK_EX) # 给文件加锁,阻塞进程
fcntl.lockf(f, fcntl.LOCK_EX | fcntl.LOCK_NB) # 给文件加锁,使用了fcntl.LOCK_NB,不阻塞进程
print '对文件 {} 加锁,文件锁持续 {} 秒'.format(self.name, self.wait)
time.sleep(int(self.wait))
print '文件已解锁'
# 1、文件close之后,文件锁也会失效
# 2、进程结束后,文件锁也会失效
# 3、flock()的LOCK_EX是"劝告锁",系统内核不会强制检查锁的状态,需要在代码中进行文件操作的地方显示检查才能生效
except IOError as e:
print '文件已加锁,无法执行加锁, err:%s' % e
if __name__ == "__main__":
locker = FLOCK(sys.argv[1], sys.argv[2])
locker.lock_unlock()
先运行一个终端会打印:

运行另外一个终端:

网友评论