轉載自:http://zhou123.blog.51cto.com/4355617/1650185
python 中給文件加鎖——fcntl模塊
import fcntl
打開一個文件
f = open('./test') ##當前目錄下test文件要先存在,如果不存在會報錯。
對該文件加鎖:
fcntl.flock(f,fcntl.LOCK_EX)
這樣就對文件test加鎖了,如果有其他進程對test文件加鎖,則不能成功,會被阻塞,但不會退出程序。
解鎖:fcntl.flock(f,fcntl.LOCK_UN)
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/env python
#coding=utf8
import os
import sys
import time
import fcntl
class FLOCK():
def __init__(self,name):
self.fobj = open('name','w')
self.fd = self.fobj.fileno()
def lock(self):
try:
fcntl.flock(self.fd,fcntl.LOCK_EX|fcntl.LOCK_NB) ####文件加鎖
print('file is lock.........')
data = self.fobj.read()
print(data)
time.sleep(20)
return(True)
except:
print('file is locked please waiting!!!!!!!!!!!!!!')
return(False)
def unlock(self):
fcntl.flock(self.fd,fcntl.LOCK_UN)
self.fobj.close()
frint('is unlock!!!!!!!!!')
if __name__ == '__main__':
print sys.argv[1]
locker = FLOCK(sys.argv[1])
a = locker.lock()
if a:
print('lock success')
else:
print('no')
執行結果:
[root@cdn ~]# python fc.py test #######此腳本鎖定文件
test
file is lock............
@!sdagdggggggggggggg ########test文件內容
lock success
[root@cdn ~]# python fc.py test ########開啓另一個終端,運行腳本,文件被鎖定
test
file is locked please waiting!!!!!!!!!!!!!!
no