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字典排序实例详解
May 20 Python
Python复制文件操作实例详解
Nov 10 Python
Python合并字典键值并去除重复元素的实例
Dec 18 Python
Django Admin实现三级联动的示例代码(省市区)
Jun 22 Python
Python3使用pandas模块读写excel操作示例
Jul 03 Python
Django migrations 默认目录修改的方法教程
Sep 28 Python
python通过tcp发送xml报文的方法
Dec 28 Python
Pandas之Fillna填充缺失数据的方法
Jun 25 Python
Python numpy线性代数用法实例解析
Nov 15 Python
Python3之外部文件调用Django程序操作model等文件实现方式
Apr 07 Python
python中pickle模块浅析
Dec 29 Python
python神经网络Xception模型
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超大文件下载,断点续传下载的方法详解
2013/06/06 PHP
如何阻止网站被恶意反向代理访问(防网站镜像)
2014/03/18 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(四)
2014/06/23 PHP
php单例模式的简单实现方法
2016/06/10 PHP
PHP精确计算功能示例
2016/11/29 PHP
php批量删除操作(数据访问)
2017/05/23 PHP
利用PHP实现开心消消乐的算法示例
2017/10/12 PHP
PHP里的$_GET数组介绍
2019/03/22 PHP
CentOS7系统搭建LAMP及更新PHP版本操作详解
2020/03/26 PHP
超强的IE背景图片闪烁(抖动)的解决办法
2007/09/09 Javascript
js写一个弹出层并锁屏效果实现代码
2012/12/07 Javascript
jqgrid 编辑添加功能详细解析
2013/11/08 Javascript
基于jQuery实现带动画效果超炫酷的弹出对话框(附源码下载)
2016/02/22 Javascript
微信小程序使用navigateTo数据传递的实例
2017/09/26 Javascript
vue 实现在函数中触发路由跳转的示例
2018/09/01 Javascript
微信小程序中的canvas 文字断行和省略号显示功能的处理方法
2018/11/14 Javascript
Python实现类继承实例
2014/07/04 Python
Python处理RSS、ATOM模块FEEDPARSER介绍
2015/02/18 Python
python实现通过代理服务器访问远程url的方法
2015/04/29 Python
Tensorflow实现AlexNet卷积神经网络及运算时间评测
2018/05/24 Python
在cmder下安装ipython以及环境的搭建
2018/10/19 Python
详解python 模拟豆瓣登录(豆瓣6.0)
2019/04/18 Python
python如何实现数据的线性拟合
2019/07/19 Python
在python中用url_for构造URL的方法
2019/07/25 Python
Python使用scrapy爬取阳光热线问政平台过程解析
2019/08/14 Python
Python:type、object、class与内置类型实例
2019/12/25 Python
python3连接mysql获取ansible动态inventory脚本
2020/01/19 Python
了解一下python内建模块collections
2020/09/07 Python
一款基于css3和jquery实现的动画显示弹出层按钮教程
2015/01/04 HTML / CSS
html5中 media(播放器)的api使用指南
2014/12/26 HTML / CSS
日本化妆品植村秀俄罗斯官方网站:Shu Uemura俄罗斯
2020/02/01 全球购物
财务管理专业推荐信
2013/11/19 职场文书
计算机网络及管理学专业求职信
2014/06/05 职场文书
创先争优宣传标语
2014/10/08 职场文书
报案材料怎么写
2015/05/25 职场文书
2015年民兵整组工作总结
2015/07/24 职场文书