python使用fcntl模块实现程序加锁功能示例


Posted in Python onJune 23, 2017

本文实例讲述了python使用fcntl模块实现程序加锁功能。分享给大家供大家参考,具体如下:

python 中引入给文件加锁的 fcntl模块

import fcntl

打开一个文件

##当前目录下test文件要先存在,如果不存在会报错。或者以写的方式打开
f = open('./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)

请看示例:

import sys
import time
import fcntl
class FLOCK(object):
 def __init__(self, name):
  self.fobj = open(name, 'w')
  self.fd = self.fobj.fileno()
 def lock(self):
  try:
   fcntl.lockf(self.fd, fcntl.LOCK_EX | fcntl.LOCK_NB) # 给文件加锁,使用了fcntl.LOCK_NB
   print '给文件加锁,稍等 ... ...'
   time.sleep(20)
   return True
  except:
   print '文件加锁,无法执行,请稍后运行。'
   return False
def unlock(self):
 self.fobj.close()
 print '已解锁'
if __name__ == "__main__":
 print sys.argv[1]
 locker = FLOCK(sys.argv[1])
 a = locker.lock()
 if a:
  print '文件已加锁'
 else:
  print '无法执行,程序已锁定,请稍等'

先运行一个终端会打印:

python lockfile.py test

test

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

文件已加锁

运行另外一个终端:

test
     文件加锁,无法执行,请稍后运行。
     无法执行,程序已锁定,请稍等

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
Python数据结构之Array用法实例
Oct 09 Python
Python的包管理器pip更换软件源的方法详解
Jun 20 Python
Python探索之修改Python搜索路径
Oct 25 Python
Python使用matplotlib实现绘制自定义图形功能示例
Jan 18 Python
python中的set实现不重复的排序原理
Jan 24 Python
Django REST framework视图的用法
Jan 16 Python
对Python强大的可变参数传递机制详解
Jun 13 Python
python 实现的发送邮件模板【普通邮件、带附件、带图片邮件】
Jul 06 Python
python 字典 setdefault()和get()方法比较详解
Aug 07 Python
如何基于python实现画不同品种的樱花树
Jan 03 Python
Python操作PostgreSql数据库的方法(基本的增删改查)
Dec 29 Python
Python进度条的使用
May 17 Python
Django自定义认证方式用法示例
Jun 23 #Python
Django实现的自定义访问日志模块示例
Jun 23 #Python
详解Python文本操作相关模块
Jun 22 #Python
python字符串过滤性能比较5种方法
Jun 22 #Python
Python编程实现的简单Web服务器示例
Jun 22 #Python
Python实现复杂对象转JSON的方法示例
Jun 22 #Python
Collatz 序列、逗号代码、字符图网格实例
Jun 22 #Python
You might like
帝国cms目录结构分享
2015/07/06 PHP
php中实现用数组妩媚地生成要执行的sql语句
2015/07/10 PHP
PHP框架Laravel学习心得体会
2015/10/28 PHP
PHP XML和数组互相转换详解
2016/10/26 PHP
JQuery 技巧和窍门整理(8个)
2010/04/22 Javascript
JavaScript 操作table,可以新增行和列并且隔一行换背景色代码分享
2013/07/05 Javascript
JavaScript数组函数unshift、shift、pop、push使用实例
2014/08/27 Javascript
JavaScript获取当前网页标题(title)的方法
2015/04/03 Javascript
浅谈javascript中for in 和 for each in的区别
2015/04/23 Javascript
详解JavaScript中循环控制语句的用法
2015/06/03 Javascript
angularjs学习笔记之双向数据绑定
2015/09/26 Javascript
javascript跨域的方法汇总
2015/10/23 Javascript
使用Jasmine和Karma对AngularJS页面程序进行测试
2016/03/05 Javascript
JQuery的Pager分页器实现代码
2016/05/03 Javascript
JavaScript 数组中最大最小值
2016/06/05 Javascript
浅谈JavaScript 数据属性和访问器属性
2016/09/01 Javascript
Javascript highcharts 饼图显示数量和百分比实例代码
2016/12/06 Javascript
详解NodeJs支付宝移动支付签名及验签
2017/01/06 NodeJs
Express URL跳转(重定向)的实现方法
2017/04/07 Javascript
10种JavaScript最常见的错误(小结)
2019/06/21 Javascript
ES6函数和数组用法实例分析
2020/05/23 Javascript
python try 异常处理(史上最全)
2019/03/07 Python
详解python中@的用法
2019/03/27 Python
手把手教你Python yLab的绘制折线图的画法
2019/10/23 Python
Python Tkinter Entry和Text的添加与使用详解
2020/03/04 Python
python语言的优势是什么
2020/06/17 Python
Selenium之模拟登录铁路12306的示例代码
2020/07/31 Python
戛纳奢侈品商店:Jacques Loup法国
2019/11/04 全球购物
linux面试题参考答案(11)
2012/05/01 面试题
高级销售员求职信
2013/10/25 职场文书
自荐信的格式
2014/03/10 职场文书
应聘销售主管的求职信
2014/04/26 职场文书
2015年小学生自我评价范文
2015/03/03 职场文书
看完这篇文章获得一些java if优化技巧
2021/07/15 Java/Android
5人制售《绝地求生》游戏外挂获利500多万元 被判刑
2022/03/31 其他游戏
Android 界面一键变灰 深色主题工具类
2022/04/28 Java/Android