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. linux编程学习

    linux编程学习 工具篇 “公欲善其事,必先利其器”.编程是一门实践性很强的工作,在你以后的学习或工作中,你将常常会与以下工具打交道, 下面列出学习 C 语言编程常常用到的软件和工具. (一)操作系 ...

  2. Codeforces Round #363 (Div. 2) B 暴力

    Description You are given a description of a depot. It is a rectangular checkered field of n × m siz ...

  3. EasySlider-最简洁的JQuery滚动插件 可控制滚动

    原文发布时间为:2010-05-05 -- 来源于本人的百度文章 [由搬家工具导入] Easy Silder是由Alen Grakalic开发的基于JQuery的滚动插件,它支持以下功能: 1.自动滚 ...

  4. Cryptography I 学习笔记 --- 信息完整性

    1. ECBC-MAC,需要一对密钥k与k1,然后将明文分组,用cbc模式对明文分块加密,将最后的密文块再用k1进行加密,即可得到结果 2. NMAC,需要一对密钥k与k1,然后将明文分组,用k加密第 ...

  5. FZU 1075 分解素因子【数论/唯一分解定理/分解素因子裸模板】

    [唯一分解定理]:https://www.cnblogs.com/mjtcn/p/6743624.html 假设x是一个正整数,它的值不超过65535(即1<x<=65535),请编写一个 ...

  6. Xamarin XAML语言教程将XAML设计的UI显示到界面

    Xamarin XAML语言教程将XAML设计的UI显示到界面 如果通过XAML将UI设计好以后,就可以将XAML中的内容显示给用户了,也就是显示到界面上.由于创建XAML文件方式的不同,所以将XAM ...

  7. 打包python脚本为exe

    更新pip 安装

  8. Android Retrofit使用教程(二)

    上一篇文章讲述了Retrofit的简单使用,这次我们学习一下Retrofit的各种HTTP请求. Retrofit基础 在Retrofit中使用注解的方式来区分请求类型.比如@GET("&q ...

  9. 调整type="file"时的input的

    <input type="file"> 在ie下的视图如下 而在firefox下的是 一般为了界面美化的效果,会将其设置为透明,然后覆盖一个<a href = & ...

  10. 真正解决 thinkphp 验证码 出错 无法显示 问题

    今天做到验证码这一块想到tp自带验证图片  大喜单鼓捣半天不出来 一直是个小 X 官方提示:如果无法显示验证码,请检查:² PHP是否已经安装GD库支持:²输出之前是否有任何的输出(尤其是UTF8的B ...