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单线程实现多个定时器示例
Mar 30 Python
给Python IDLE加上自动补全和历史功能
Nov 30 Python
python开发简易版在线音乐播放器
Mar 03 Python
详解python中Numpy的属性与创建矩阵
Sep 10 Python
Python类装饰器实现方法详解
Dec 21 Python
Python 列表去重去除空字符的例子
Jul 20 Python
python使用opencv在Windows下调用摄像头实现解析
Nov 26 Python
numpy:np.newaxis 实现将行向量转换成列向量
Nov 30 Python
pytorch实现用CNN和LSTM对文本进行分类方式
Jan 08 Python
flask 框架操作MySQL数据库简单示例
Feb 02 Python
Pytorch maxpool的ceil_mode用法
Feb 18 Python
pycharm的python_stubs问题
Apr 08 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年最新CPU天梯图
2021/03/04 数码科技
php 之 没有mysql支持时的替代方案
2006/10/09 PHP
PHP 开发环境配置(Zend Server安装)
2010/04/28 PHP
PHP中error_reporting()函数的用法(修改PHP屏蔽错误)
2011/07/01 PHP
PHP单例模式详细介绍
2015/07/01 PHP
PHP实现清除wordpress里恶意代码
2015/10/21 PHP
javascript实现原生ajax的几种方法介绍
2013/09/21 Javascript
JQuery伸缩导航练习示例
2013/11/13 Javascript
form表单action提交的js部分与html部分
2014/01/07 Javascript
DOM节点的替换或修改函数replaceChild()用法实例
2015/01/12 Javascript
jQuery实现表单步骤流程导航代码分享
2015/08/28 Javascript
JS响应鼠标点击实现两个滑块区间拖动效果
2015/10/26 Javascript
深入浅析AngularJS和DataModel
2016/02/16 Javascript
JQuery validate插件Remote用法大全
2016/05/15 Javascript
使用RequireJS库加载JavaScript模块的实例教程
2016/06/06 Javascript
es6+angular1.X+webpack 实现按路由功能打包项目的示例
2017/08/16 Javascript
SelectPage v2.4 发布新增纯下拉列表和关闭分页功能
2017/09/07 Javascript
vue使用$emit时,父组件无法监听到子组件的事件实例
2018/02/26 Javascript
[05:31]DOTA2上海特级锦标赛主赛事第三日RECAP
2016/03/05 DOTA
分享Python文本生成二维码实例
2016/01/06 Python
Python 常用 PEP8 编码规范详解
2017/01/22 Python
Python日期时间模块datetime详解与Python 日期时间的比较,计算实例代码
2018/09/14 Python
详解10个可以快速用Python进行数据分析的小技巧
2019/06/24 Python
pytorch使用 to 进行类型转换方式
2020/01/08 Python
Python基于百度AI实现OCR文字识别
2020/04/02 Python
python进度条显示-tqmd模块的实现示例
2020/08/23 Python
Pycharm中使用git进行合作开发的教程详解
2020/11/17 Python
伊莱克斯阿根廷网上商店:Tienda Electrolux
2021/03/08 全球购物
TCP协议通讯的过程和步骤是什么
2015/10/18 面试题
党的群众路线教育实践活动个人承诺书
2014/05/22 职场文书
优秀员工自荐书
2015/03/06 职场文书
2015圣诞节贺卡寄语
2015/03/24 职场文书
技术转让协议书
2016/03/19 职场文书
详解Java七大阻塞队列之SynchronousQueue
2021/09/04 Java/Android
MySQL数据库查询进阶之多表查询详解
2022/04/08 MySQL
使用Bandicam录制鼠标指针并附带点击声音,还可以添加点击动画效果
2022/04/11 数码科技