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抓取网页内容示例分享
Feb 24 Python
Python使用reportlab将目录下所有的文本文件打印成pdf的方法
May 20 Python
Python编程入门之Hello World的三种实现方式
Nov 13 Python
Python 爬虫学习笔记之正则表达式
Sep 21 Python
Flask 让jsonify返回的json串支持中文显示的方法
Mar 26 Python
用TensorFlow实现戴明回归算法的示例
May 02 Python
设置python3为默认python的方法
Oct 31 Python
python实现QQ邮箱/163邮箱的邮件发送
Jan 22 Python
详解Python连接MySQL数据库的多种方式
Apr 16 Python
PyCharm2019安装教程及其使用(图文教程)
Sep 29 Python
Python openpyxl模块原理及用法解析
Jan 19 Python
Python基于Twilio及腾讯云实现国际国内短信接口
Jun 18 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读取mysql乱码,用set names XXX解决的原理分享
2011/12/29 PHP
需要注意的几个PHP漏洞小结
2012/02/05 PHP
javascript html 静态页面传参数
2009/04/10 Javascript
javascript 计算两个整数的百分比值
2009/12/26 Javascript
javascript+iframe 实现无刷新载入整页的代码
2010/03/17 Javascript
单独使用CKFinder选择图片的方法
2010/08/21 Javascript
前端开发的开始---基于面向对象的Ajax类
2010/09/17 Javascript
jquery动画4.升级版遮罩效果的图片走廊--带自动运行效果
2012/08/24 Javascript
使用CoffeeScrip优美方式编写javascript代码
2015/10/28 Javascript
原生js实现图片层叠轮播切换效果
2016/02/02 Javascript
jquery中取消和绑定hover事件的实现代码
2016/06/02 Javascript
功能强大的Bootstrap使用手册(一)
2016/08/02 Javascript
详解网站中图片日常使用以及优化手法
2017/01/09 Javascript
利用JS实现简单的日期选择插件
2017/01/23 Javascript
js中编码函数:escape,encodeURI与encodeURIComponent详解
2017/03/21 Javascript
vue如何集成raphael.js中国地图的方法示例
2017/08/15 Javascript
微信小程序实现自定义picker选择器弹窗内容
2020/05/26 Javascript
原生JS封装_new函数实现new关键字的功能
2018/08/12 Javascript
NodeJS实现同步的方法
2019/03/02 NodeJs
jQuery实现动态加载瀑布流
2020/09/01 jQuery
vue render函数动态加载img的src路径操作
2020/10/26 Javascript
Python循环语句中else的用法总结
2016/09/11 Python
Python中struct模块对字节流/二进制流的操作教程
2017/01/21 Python
python通过opencv实现批量剪切图片
2017/11/13 Python
Django重装mysql后启动报错:No module named ‘MySQLdb’的解决方法
2018/04/22 Python
python如何以表格形式打印输出的方法示例
2019/06/21 Python
Python中Unittest框架的具体使用
2019/08/27 Python
如何查看Django ORM执行的SQL语句的实现
2020/04/20 Python
Python中zipfile压缩文件模块的基本使用教程
2020/06/14 Python
Python 使用 PyQt5 开发的关机小工具分享
2020/07/16 Python
C++和python实现阿姆斯特朗数字查找实例代码
2020/12/07 Python
Jacadi Paris英国官网:法国童装品牌
2019/08/09 全球购物
保险公司晨会主持词
2014/03/22 职场文书
施工安全责任书
2014/04/14 职场文书
初一学生期末评语
2014/04/24 职场文书
pyqt5打包成exe可执行文件的方法
2021/05/14 Python