1. python 中给文件加锁——fcntl模块
    import fcntl
  2.  
  3. 打开一个文件
    ##当前目录下test文件要先存在,如果不存在会报错。或者以写的方式打开
    f = open('./test')
    对该文件加密:
    fcntl.flock(f,fcntl.LOCK_EX)
    这样就对文件test加锁了,如果有其他进程对test文件加锁,则不能成功,会被阻塞,但不会退出程序。
    解锁:fcntl.flock(f,fcntl.LOCK_UN)
  4.  
  5. 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_SHLOCK_NB进行按位或(|)运算操作。 fcnt.flock(f,fcntl.LOCK_EX|fcntl.LOCK_NB)
  6.  
  7. 请看事例:
  1. import sys
  2. import time
  3. import fcntl
  4.  
  5. class FLOCK(object):
  6.  
  7. def __init__(self, name):
  8. self.fobj = open(name, 'w')
  9. self.fd = self.fobj.fileno()
  10.  
  11. def lock(self):
  12. try:
  13. fcntl.lockf(self.fd, fcntl.LOCK_EX | fcntl.LOCK_NB) # 给文件加锁,使用了fcntl.LOCK_NB
  14. print '给文件加锁,稍等 ... ...'
  15. time.sleep()
  16. return True
  17. except:
  18. print '文件加锁,无法执行,请稍后运行。'
  19. return False
  20.  
  21. def unlock(self):
  22. self.fobj.close()
  23. print '已解锁'
  24.  
  25. if __name__ == "__main__":
  26. print sys.argv[]
  27. locker = FLOCK(sys.argv[])
  28. a = locker.lock()
  29. if a:
  30. print '文件已加锁'
  31. else:
  32. print '无法执行,程序已锁定,请稍等'

先运行一个终端会打印:

  python lockfile.py test

  test

  给文件加锁,稍等 ... ...

  文件已加锁

运行另外一个终端:

  test

     文件加锁,无法执行,请稍后运行。

     无法执行,程序已锁定,请稍等

  

python中给程序加锁之fcntl模块的使用的更多相关文章

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

    如果没有fcntl模块则用 sudo pip install fcntl安装 模块简单说明: 打开文件,不存在则创建之 f = open('./test','w') fcntl.flock(f,fcn ...

  2. Python中的日志记录方案-logging模块&loguru模块

    原文链接 原创: 崔庆才 在 Python 中,一般情况下我们可能直接用自带的 logging 模块来记录日志,包括我之前的时候也是一样.在使用时我们需要配置一些 Handler.Formatter ...

  3. Python中操作HTTP请求的urllib模块详解

    urllib 是 Python 标准库中用于网络请求的库.该库有四个模块,分别是urllib.request,urllib.error,urllib.parse,urllib.robotparser. ...

  4. 2016/1/3 Python中的多线程(2):threading模块

    之前提了Python多线程的一点使用,今天介绍更好的threading模块,它提供了Thread类和一些比较好用的同步机制. 先介绍Thread类 threading模块中的Thread类有很多thr ...

  5. Python中import导入上一级目录模块及循环import问题的解决

    转自:https://www.cnblogs.com/sjy18039225956/p/9265461.html 使用python进行程序编写时,经常会使用第三方模块包.这种包我们可以通过python ...

  6. python中处理命令行参数的模块optpars

    optpars是python中用来处理命令行参数的模块,可以自动生成程序的帮助信息,功能强大,易于使用,可以方便的生成标准的,符合Unix/Posix 规范的命令行说明.使用 add_option() ...

  7. Python中xlrd、xlwt、win32com模块对xls文件的读写操作

    # -*- coding: utf-8 -*- #xlrd和xlwt只支持xls文件读写,openpyxl只支持xlsx文件的读写操作 import xlrd import xlwt import w ...

  8. Python中一些内建函数及os等模块的用法

          len(obj)                   # 求长度:obj可以是str.list等对象    split(str, num)          # str-分割符,默认空格: ...

  9. Python中给文件加锁

    首先要引入库import fcntl打开一个文件f = open('./test')对该文件加密:fcntl.flock(f, fcntl.LOCK_EX)这样就对文件test加锁了,如果有其他进程要 ...

随机推荐

  1. Partition Refinement

    今天613问我怎么做DFA最小化..呃..这个我怎么可能会做呢.. 于是我就去学习了一点姿势,先把我Partition Refinement Data Structure的代码发上来好了.. 我挺菜的 ...

  2. Python之文件操作:文件的读写

    一.open函数:对文件读写之前,需要先打开文件,获取文件句柄 注意:open() file() 尽量使用open(),Python3以后不支持file()了 1.open(file_name[,ac ...

  3. 【10】【转】node 之 pipe机制----未理解

    转载地址:http://blog.csdn.net/vieri_32/article/details/48376547 前言 前几天别人请教我关于pipe的问题,我发现我虽然用了nodejs很久,但是 ...

  4. Static 静态内部类

    Java中的类可以是static吗?答案是可以.在java中我们可以有静态实例变量.静态方法.静态块.类也可以是静态的. java允许我们在一个类里面定义静态类.比如内部类(nested class) ...

  5. response contentType

    response.setContentType(MIME)的作用是使客户端浏览器,区分不同种类的数据,并根据不同的MIME调用浏览器内不同的程序嵌入模块来处理相应的数据. 例如web浏览器就是通过MI ...

  6. JAVA神操作--使用Arthas线上热更新实战

    热更不规范,同事两行泪 背景 C君是一个javaer,最近在开发用户登出接口的时候,不小心把接口参数拼错了 正确的是: /api/v1/user/logout?referrer=www.javaer. ...

  7. Jquery : 上下滚动--单行 批量多行 文字图片翻屏【转】

    原文发布时间为:2010-02-01 -- 来源于本人的百度文章 [由搬家工具导入] 注:如果和左右滚动一起使用,则会出现冲突 一单行滚动(ad:http://www.gz138.com) <! ...

  8. [LeetCode] Search in Rotated Sorted Array II 二分搜索

    Follow up for "Search in Rotated Sorted Array":What if duplicates are allowed? Would this ...

  9. [Visual Studio] 确定项目是用Visual Studio哪个版本开发的

    用记事本打开 .sln文件,在第3行就有:

  10. 什麼是 usb upstream port

    主機USB埠是定義為USB纜線的上行端(Upstream)或「A」接頭,即PC端.而裝置USB埠是定義為USB纜線的下行端(Downstream)或「B」接頭,即行動產品端. Reference ht ...