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查询mysql中文乱码问题
Nov 09 Python
Python读大数据txt
Mar 28 Python
Python自动化部署工具Fabric的简单上手指南
Apr 19 Python
Python cookbook(字符串与文本)针对任意多的分隔符拆分字符串操作示例
Apr 19 Python
pandas修改DataFrame列名的实现方法
Feb 22 Python
Python 获取ftp服务器文件时间的方法
Jul 02 Python
使用python将多个excel文件合并到同一个文件的方法
Jul 09 Python
Django框架下静态模板的继承操作示例
Nov 08 Python
一文读懂python Scrapy爬虫框架
Feb 24 Python
python re模块常见用法例举
Mar 01 Python
Python OpenCV超详细讲解基本功能
Apr 02 Python
Python基本的内置数据类型及使用方法
Apr 13 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
ASP知识讲座四
2006/10/09 PHP
php 提速工具eAccelerator 配置参数详解
2010/05/16 PHP
解析php DOMElement 操作xml 文档的实现代码
2013/05/10 PHP
基于PHP中的常用函数回顾
2013/07/11 PHP
javascript 变量作用域 代码分析
2009/06/26 Javascript
jQuery的一些特性和用法整理小结
2010/01/13 Javascript
jQuery实现 注册时选择阅读条款 左右移动
2013/04/11 Javascript
动态载入js提高网页打开速度的方法
2014/07/04 Javascript
深入理解JavaScript系列(43):设计模式之状态模式详解
2015/03/04 Javascript
Javascript递归打印Document层次关系实例分析
2015/05/15 Javascript
在JS中操作时间之getUTCMilliseconds()方法的使用
2015/06/10 Javascript
基于jQuery实现仿51job城市选择功能实例代码
2016/03/02 Javascript
jquery插件Jplayer使用方法简析
2016/04/22 Javascript
Angular 2父子组件数据传递之@ViewChild获取子组件详解
2017/07/04 Javascript
利用JS hash制作单页Web应用的方法详解
2017/10/10 Javascript
js将键值对字符串转为json字符串的方法
2018/03/30 Javascript
vue基础之v-bind属性、class和style用法分析
2019/03/11 Javascript
微信小程序实现简单购物车功能
2020/12/30 Javascript
动态实现element ui的el-table某列数据不同样式的示例
2021/01/22 Javascript
python网络编程示例(客户端与服务端)
2014/04/24 Python
在Python的Flask框架中实现单元测试的教程
2015/04/20 Python
浅析Python中的序列化存储的方法
2015/04/28 Python
PYQT5设置textEdit自动滚屏的方法
2019/06/14 Python
python画微信表情符的实例代码
2019/10/09 Python
Python切图九宫格的实现方法
2019/10/10 Python
python图形开发GUI库pyqt5的详细使用方法及各控件的属性与方法
2020/02/14 Python
python实现自动清理重复文件
2020/08/24 Python
如何利用Python写个坦克大战
2020/11/18 Python
Electrolux伊莱克斯巴西商店:家用电器、小家电和配件
2018/05/23 全球购物
伦敦著名的运动鞋综合商店:Footpatrol
2019/03/25 全球购物
创先争优制度
2014/01/21 职场文书
学校领导班子对照检查材料
2014/08/28 职场文书
小浪底导游词
2015/02/12 职场文书
保险内勤岗位职责
2015/04/13 职场文书
2016年共产党员公开承诺书
2016/03/24 职场文书
Python序列化模块JSON与Pickle
2022/06/05 Python