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中使用urllib2获取http请求状态码的代码例子
Jul 07 Python
Python简单日志处理类分享
Feb 14 Python
用Python代码来绘制彭罗斯点阵的教程
Apr 03 Python
Python操作csv文件实例详解
Jul 31 Python
Python使用xlwt模块操作Excel的方法详解
Mar 27 Python
python 设置输出图像的像素大小方法
Jul 04 Python
python实现从ftp服务器下载文件
Mar 03 Python
python GUI库图形界面开发之PyQt5信号与槽的高级使用技巧装饰器信号与槽详细使用方法与实例
Mar 06 Python
关于python 跨域处理方式详解
Mar 28 Python
python如何保存文本文件
Jun 07 Python
python判断字符串以什么结尾的实例方法
Sep 18 Python
Python基于Tkinter开发一个爬取B站直播弹幕的工具
May 06 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
php获取指定(访客)IP所有信息(地址、邮政编码、国家、经纬度等)的方法
2015/07/06 PHP
适用于初学者的简易PHP文件上传类
2015/10/29 PHP
ThinkPHP框架获取最后一次执行SQL语句及变量调试简单操作示例
2018/06/13 PHP
thinkPHP5框架路由常用知识点汇总
2019/09/15 PHP
js trim函数 去空格函数与正则集锦
2009/11/20 Javascript
JQuery读取XML文件数据并显示的实现代码
2009/12/16 Javascript
JQuery 学习技巧总结
2010/05/21 Javascript
Jquery实现的tab效果可以指定默认显示第几页
2013/10/16 Javascript
jQuery异步获取json数据方法汇总
2014/12/22 Javascript
Javascript基础教程之变量
2015/01/18 Javascript
jQuery网页版打砖块小游戏源码分享
2015/08/20 Javascript
js判断checkbox是否选中个数的方法(超简单)
2016/08/19 Javascript
微信小程序(六):列表上拉加载下拉刷新示例
2017/01/13 Javascript
Async/Await替代Promise的6个理由
2019/06/15 Javascript
如何解决js函数防抖、节流出现的问题
2019/06/17 Javascript
jquery获取input输入框中的值
2019/11/13 jQuery
[01:09:24]Ti4开幕式
2014/07/19 DOTA
部署Python的框架下的web app的详细教程
2015/04/30 Python
Python中for循环和while循环的基本使用方法
2015/08/21 Python
使用python生成杨辉三角形的示例代码
2018/08/29 Python
python多进程控制学习小结
2018/10/31 Python
python3通过selenium爬虫获取到dj商品的实例代码
2019/04/25 Python
使用Python的Turtle绘制哆啦A梦实例
2019/11/21 Python
django model object序列化实例
2020/03/13 Python
Jupyter Notebook的连接密码 token查询方式
2020/04/21 Python
Python如何优雅删除字符列表空字符及None元素
2020/06/25 Python
django中cookiecutter的使用教程
2020/12/03 Python
一款纯css3实现的圆形旋转分享按钮旋转角度可自己调整
2014/09/02 HTML / CSS
欧洲最大的滑雪假期供应商之一:Sunweb Holidays
2018/01/06 全球购物
如果让你测试一台高速激光打印机,你都会进行哪些测试
2012/12/04 面试题
2014年艾滋病防治工作总结
2014/12/10 职场文书
孝女彩金观后感
2015/06/10 职场文书
花田少年史观后感
2015/06/16 职场文书
贷款担保书范本
2015/09/22 职场文书
如何书写你的职业生涯规划书?
2019/06/27 职场文书
解决Redis启动警告问题
2022/02/24 Redis