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获取apk文件URL地址实例
Nov 01 Python
python操作mysql中文显示乱码的解决方法
Oct 11 Python
安装python时MySQLdb报错的问题描述及解决方法
Mar 20 Python
Python 硬币兑换问题
Jul 29 Python
Python爬虫使用代理IP的实现
Oct 27 Python
Python values()与itervalues()的用法详解
Nov 27 Python
pytorch 实现在一个优化器中设置多个网络参数的例子
Feb 20 Python
pycharm中如何自定义设置通过“ctrl+滚轮”进行放大和缩小实现方法
Sep 16 Python
python3 使用ssh隧道连接mysql的操作
Dec 05 Python
Python竟然能剪辑视频
May 25 Python
拒绝盗图!教你怎么用python给图片加水印
Jun 04 Python
Python实现GIF动图以及视频卡通化详解
Dec 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 smarty截取中文字符乱码问题?gb2312/utf-8
2011/11/07 PHP
PHP日志LOG类定义与用法示例
2018/09/06 PHP
document.all还是document.getElementsByName?
2006/07/21 Javascript
理解 JavaScript 预解析
2009/10/25 Javascript
functional继承模式 摘自javascript:the good parts
2011/06/20 Javascript
不同Jquery版本引发的问题解决
2013/10/14 Javascript
JavaScript中的无阻塞加载性能优化方案
2014/10/10 Javascript
jQuery+css3实现转动的正方形效果(附demo源码下载)
2016/01/27 Javascript
基于BootStrap Metronic开发框架经验小结【七】数据的导入、导出及附件的查看处理
2016/05/12 Javascript
JS判断浏览器是否安装flash插件的简单方法
2016/09/13 Javascript
node.js的http.createServer过程深入解析
2019/06/06 Javascript
Vue中fragment.js使用方法小结
2020/02/17 Javascript
Vue通过getAction的finally来最大程度避免影响主数据呈现问题
2020/04/24 Javascript
解决Echarts2竖直datazoom滑动后显示数据不全的问题
2020/07/20 Javascript
图解JS原型和原型链实现原理
2020/09/15 Javascript
在react-antd中弹出层form内容传递给父组件的操作
2020/10/24 Javascript
[01:04:14]OG vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
python获取文件版本信息、公司名和产品名的方法
2014/10/05 Python
Python使用ftplib实现简易FTP客户端的方法
2015/06/03 Python
使用Python制作微信跳一跳辅助
2018/01/31 Python
Python的numpy库中将矩阵转换为列表等函数的方法
2018/04/04 Python
Numpy之文件存取的示例代码
2018/08/03 Python
Python3爬虫学习之应对网站反爬虫机制的方法分析
2018/12/12 Python
Python基于datetime或time模块分别获取当前时间戳的方法实例
2019/02/19 Python
基于Django的乐观锁与悲观锁解决订单并发问题详解
2019/07/31 Python
Python实现新型冠状病毒传播模型及预测代码实例
2020/02/05 Python
python实现俄罗斯方块游戏(改进版)
2020/03/13 Python
如何表示python中的相对路径
2020/07/08 Python
CSS3悬停效果案例应用
2012/11/21 HTML / CSS
花卉与景观设计系大学生求职信
2013/10/01 职场文书
博士论文答辩开场白
2015/06/01 职场文书
指导教师推荐意见
2015/06/05 职场文书
律政俏佳人观后感
2015/06/09 职场文书
医者仁心观后感
2015/06/17 职场文书
心得体会格式及范文
2016/01/25 职场文书
php 获取音视频时长,PHP 利用getid3 获取音频文件时长等数据
2021/04/01 PHP