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中的闭包总结
Sep 18 Python
探究python中open函数的使用
Mar 01 Python
PYTHON压平嵌套列表的简单实现
Jun 08 Python
详解python实现线程安全的单例模式
Mar 05 Python
python随机取list中的元素方法
Apr 08 Python
python爬虫框架scrapy实现模拟登录操作示例
Aug 02 Python
python爬取微信公众号文章的方法
Feb 26 Python
介绍一款python类型检查工具pyright(推荐)
Jul 03 Python
python安装dlib库报错问题及解决方法
Mar 16 Python
使用 django orm 写 exists 条件过滤实例
May 20 Python
AI:如何训练机器学习的模型
Apr 16 Python
django上传文件的三种方式
Apr 29 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保存任意网络图片到服务器的方法
2015/04/14 PHP
PHP面向对象程序设计之对象生成方法详解
2016/12/02 PHP
php事务回滚简单实现方法示例
2017/03/28 PHP
JavaScript 加号(+)运算符号
2009/12/06 Javascript
JS按字节截取字符长度实例
2013/11/20 Javascript
jquery $.trim()方法使用介绍
2014/05/21 Javascript
jquery代码实现简单的随机图片瀑布流效果
2015/04/20 Javascript
JQuery实现的按钮倒计时效果
2015/12/23 Javascript
javascript之with的使用(阿里云、淘宝使用代码分析)
2016/10/11 Javascript
微信小程序  modal弹框组件详解
2016/10/27 Javascript
javascript中Number的方法小结
2016/11/21 Javascript
微信公众号开发 实现点击返回按钮就返回到聊天界面
2016/12/15 Javascript
jQuery读取本地的json文件(实例讲解)
2017/10/31 jQuery
vue 不使用select实现下拉框功能(推荐)
2018/05/17 Javascript
Vue用v-for给循环标签自身属性添加属性值的方法
2018/10/18 Javascript
Vue CLI3创建项目部署到Tomcat 使用ngrok映射到外网
2019/05/16 Javascript
layui radio单选限制下一个radio单选的实例
2019/09/03 Javascript
matplotlib中legend位置调整解析
2017/12/19 Python
Python实现备份MySQL数据库的方法示例
2018/01/11 Python
python将回车作为输入内容的实例
2018/06/23 Python
Python实现通过继承覆盖方法示例
2018/07/02 Python
python使用scrapy发送post请求的坑
2018/09/04 Python
Python设计模式之备忘录模式原理与用法详解
2019/01/15 Python
python基础梳理(一)(推荐)
2019/04/06 Python
pytorch下使用LSTM神经网络写诗实例
2020/01/14 Python
基于Python爬取51cto博客页面信息过程解析
2020/08/25 Python
瑞贝卡·泰勒官方网站:Rebecca Taylor
2016/09/24 全球购物
法国设计制造的扫帚和刷子:Andrée Jardin
2018/12/06 全球购物
在印度上传处方,在线订购药品:Medlife
2019/03/28 全球购物
全球速卖通俄罗斯站:AliExpress俄罗斯
2019/06/17 全球购物
营销与策划专业毕业生求职信
2013/11/01 职场文书
欢送退休感言
2014/02/08 职场文书
2014年科室工作总结范文
2014/12/19 职场文书
68句权威创业名言
2019/08/26 职场文书
Java异常处理try catch的基本用法
2021/12/06 Java/Android
python 实现图片特效处理
2022/04/03 Python