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守护进程(daemon)代码实例
Mar 06 Python
详解Python中expandtabs()方法的使用
May 18 Python
python编程使用selenium模拟登陆淘宝实例代码
Jan 25 Python
Python实现获取系统临时目录及临时文件的方法示例
Jun 26 Python
tensorflow入门:TFRecordDataset变长数据的batch读取详解
Jan 20 Python
python入门之基础语法学习笔记
Feb 08 Python
如何实现在jupyter notebook中播放视频(不停地展示图片)
Apr 23 Python
Keras 加载已经训练好的模型进行预测操作
Jun 17 Python
python有几个版本
Jun 17 Python
python 偷懒技巧——使用 keyboard 录制键盘事件
Sep 21 Python
python调用有道智云API实现文件批量翻译
Oct 10 Python
Python3中最常用的5种线程锁实例总结
Jul 07 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
无线电波是什么?它是怎样传输的?
2021/03/01 无线电
PHP:风雨欲来 路在何方?
2006/10/09 PHP
php在线代理转向代码
2012/05/05 PHP
PHP CLI模式下的多进程应用分析
2013/06/03 PHP
php和jquery实现地图区域数据统计展示数据示例
2014/02/12 PHP
Linux平台PHP5.4设置FPM线程数量的方法
2016/11/09 PHP
通过下拉框的值来确定输入框是否可以为空的代码
2011/10/18 Javascript
ASP.NET jQuery 实例12 通过使用jQuery validation插件简单实现用户注册页面验证功能
2012/02/03 Javascript
基于JQuery的类似新浪微博展示信息效果的代码
2012/07/23 Javascript
node.js中的buffer.Buffer.byteLength方法使用说明
2014/12/10 Javascript
javascript实现简单的页面右下角提示信息框
2015/07/31 Javascript
javascript使用 concat 方法对数组进行合并的方法
2016/09/08 Javascript
JS实现用户注册时获取短信验证码和倒计时功能
2016/10/27 Javascript
基于Node.js的WebSocket通信实现
2017/03/11 Javascript
Bootstrap Table 删除和批量删除
2017/09/22 Javascript
Vue-Access-Control 前端用户权限控制解决方案
2017/12/01 Javascript
jQuery md5加密插件jQuery.md5.js用法示例
2018/08/24 jQuery
postman自定义函数实现 时间函数的思路详解
2019/04/17 Javascript
基于Node的Axure文件在线预览的实现代码
2019/08/28 Javascript
多个Vue项目部署到服务器的步骤记录
2020/10/22 Javascript
[02:03]完美世界DOTA2联赛10月30日赛事集锦
2020/10/31 DOTA
Python实现Const详解
2015/01/27 Python
在Python中使用swapCase()方法转换大小写的教程
2015/05/20 Python
Python使用Scrapy爬取妹子图
2015/05/28 Python
python中正则表达式与模式匹配
2019/05/07 Python
浅谈django 模型类使用save()方法的好处与注意事项
2020/03/28 Python
CSS3的resize属性使用初探
2015/09/27 HTML / CSS
印尼极简主义和实惠的在线家具店:Fabelio
2019/03/27 全球购物
英国老牌潮鞋店:Offspring
2019/08/19 全球购物
运动会广播稿80字
2014/01/23 职场文书
高中体育教学反思
2014/01/29 职场文书
《跟踪台风的卫星》教学反思
2014/04/10 职场文书
公开承诺书格式
2014/05/21 职场文书
报考公务员诚信承诺书
2014/08/29 职场文书
傲慢与偏见电影观后感
2015/06/10 职场文书
致运动员赞词
2015/07/22 职场文书