首页 > 编程语言 >python 中给文件加锁——fcntl模块

python 中给文件加锁——fcntl模块

时间:2023-02-01 14:32:20浏览次数:58  
标签:fcntl 文件 加锁 python LOCK self __

如果没有fcntl模块则用

sudo pip install fcntl安装

模块简单说明:

  打开文件,不存在则创建之
  f = open('./test','w')
  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)

实例代码:

  

1 #!/usr/bin/python
2 #coding:utf8
3
4 import os
5 import sys
6 import time
7 import fcntl
8
9 class FLOCK(ojbect):
10 def __init__(self,name):
11
12 self.fobj = open(name,'w')
13 self.fd = self.fobj.fileno()
14
15 def lock(self):
16 try:
17 #给文件加锁,使用了fcntl.LOCK_NB
18 fcntl.lockf(sefl.fd,fcntl.LOCK_EX|fcntl.LOCK_NB)
19 print '给文件加锁,稍等 ... ...'
20 time.sleep(20)
21 return True
22 except:
23 print '文件加锁,无法执行,请稍后运行。'
24 retrun False
25
26 def unlock(self):
27 self.fobj.close()
28 print '已解锁'
29
30 if __name__ == "__main__":
31 print sys.argv[1]
32 locker = FLOCK(sys.argv[1])
33 a = locker.lock()
34 if a:
35 print '文件已加锁'
36 else:
37 print '无法执行,程序已锁定,请稍等'

执行结果:
# python lock.py test
test
file lock please waiting..... (在等待期间,在另一个终端,运行此程序会有下面的结果)
文件已加锁

# python lock.py test
test
file no lock please check file...
无法执行,程序已锁定,请稍等



标签:fcntl,文件,加锁,python,LOCK,self,__
From: https://blog.51cto.com/u_2820398/6031577

相关文章

  • python实现区块链代码
    如果你明白了原理其实挺简单的。加密算法是python自带的需要导入hashlibimporthashlibashashsha=hasher.sha256()sha.update('yourcontent')printsha.hexdigest()输......
  • Python-接口
    fromabcimportABCMeta,abstractmethod#接口:若干抽象方法的集合classPaymet(metaclass=ABCMeta):#abstractmethodclass#抽象方法@abstractmeth......
  • Python中报“TypeError: 'int' object is not callable”错误的解决办法
    当时就想用sum()函数求和发现之前 “sum” 这个关键字被当变量名定义过了,然后我试着把自己自定义的变量都给删除了,删除之后再次试了一下,发现可以了,果然是sum()函数被之......
  • 三行Python代码,让你的数据处理脚本快别人4倍
    Python是一门非常适合处理数据和自动化完成重复性工作的编程语言,我们在用数据训练机器学习模型之前,通常都需要对数据进行预处理,而Python就非常适合完成这项工作,比如需要重新......
  • Python迭代器,生成器,装饰器
    迭代器通常来讲从一个对象中依次取出数据,这个过程叫做遍历,这个手段称为迭代(重复执行某一段代码块,并将每一次迭代得到的结果作为下一次迭代的初始值)。可迭代对象(iterable......
  • python生成随机数、随机字符串
    importrandomimportstring#随机整数:printrandom.randint(1,50)#随机选取0到100间的偶数:printrandom.randrange(0,101,2)#随机浮点数:printrandom.random()printra......
  • 并发编程-Python
    目录01、理论多道技术null02、进程进程运行的三状态图同步和异步阻塞和非阻塞开启进程的两种方式进程对象的join方法进程之间数据相互隔离(默认情况下)进程对象及其他方法僵......
  • python 大图找小图
    frompathlibimportPathimportnumpyimportcv2classImage:def__init__(self,image):self.image=cv2.imread(image,cv2.IMREAD_UNCHANGED)@propert......
  • python pyqt5简单界面
    ​​https://doc.qt.io/qtforpython/PySide6/QtWidgets/QTableWidget.html​​importsysfromPyQt5.QtWidgetsimportQApplication,QWidget,QDesktopWidget,QHBoxLayou......
  • python json to txt
    defread(self):file_path=os.path.join("db","alert.json")ifos.path.exists(file_path):file_object=open(file_path,mode='r',encodin......