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 10 Python
Python读取环境变量的方法和自定义类分享
Nov 22 Python
Python读取数据集并消除数据中的空行方法
Jul 12 Python
python实现栅栏加解密 支持密钥加密
Mar 20 Python
Django集成搜索引擎Elasticserach的方法示例
Jun 04 Python
Python 窗体(tkinter)按钮 位置实例
Jun 13 Python
python 类之间的参数传递方式
Dec 20 Python
Python pyautogui模块实现鼠标键盘自动化方法详解
Feb 17 Python
Python matplotlib绘制图形实例(包括点,曲线,注释和箭头)
Apr 17 Python
Python高并发解决方案实现过程详解
Jul 31 Python
python装饰器实现对异常代码出现进行自动监控的实现方法
Sep 15 Python
Python使用Web框架Flask开发项目
Jun 01 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/03/03 咖啡文化
MySql 按时间段查询数据方法(实例说明)
2008/11/02 PHP
php检测iis环境是否支持htaccess的方法
2014/02/18 PHP
PHP递归删除目录几个代码实例
2014/04/21 PHP
PHP中foreach()用法汇总
2015/07/02 PHP
php利用gd库为图片添加水印
2016/11/09 PHP
PHP实现RSA签名生成订单功能【支付宝示例】
2017/06/06 PHP
javascript面向对象编程(一) 实例代码
2010/06/25 Javascript
jquery 关于event.target使用的几点说明介绍
2013/04/26 Javascript
js获取select选中的option的text示例代码
2013/12/19 Javascript
AngularJS学习笔记之ng-options指令
2015/06/16 Javascript
理解javascript异步编程
2016/01/27 Javascript
JavaScript操作表单实例讲解(上)
2016/06/20 Javascript
JS中的hasOwnProperty()和isPrototypeOf()属性实例详解
2016/08/11 Javascript
学习vue.js条件渲染
2016/12/03 Javascript
使用vue.js实现联动效果的示例代码
2017/01/10 Javascript
基于Bootstrap的Java开发问题汇总(Spring MVC)
2017/01/15 Javascript
js原生Ajax的封装和原理详解
2017/03/11 Javascript
vue elementUI table 自定义表头和行合并的实例代码
2019/05/22 Javascript
解决微信小程序中的滚动穿透问题
2019/09/16 Javascript
跟老齐学Python之有点简约的元组
2014/09/24 Python
详解python执行shell脚本创建用户及相关操作
2019/04/11 Python
基于Python3.7.1无法导入Numpy的解决方式
2020/03/09 Python
Python使用Numpy模块读取文件并绘制图片
2020/05/13 Python
详解使用HTML5的classList属性操作CSS类
2017/10/13 HTML / CSS
HTML5 新标签全部总汇(推荐)
2016/06/13 HTML / CSS
美国护肤咨询及美容产品电商:Askderm
2017/02/24 全球购物
20年同学聚会感言
2014/02/03 职场文书
超市店庆活动方案
2014/08/31 职场文书
党支部书记四风问题整改措施
2014/09/24 职场文书
个人查摆问题自查报告
2014/10/16 职场文书
教师党员个人整改措施
2014/10/27 职场文书
死者家属慰问信
2015/03/24 职场文书
史上最牛辞职信
2015/05/13 职场文书
丧事主持词
2015/07/02 职场文书
刚学完怎么用Python实现定时任务,转头就跑去撩妹!
2021/06/05 Python