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 相关文章推荐
RC4文件加密的python实现方法
Jun 30 Python
python修改list中所有元素类型的三种方法
Apr 09 Python
python logging重复记录日志问题的解决方法
Jul 12 Python
python将txt文档每行内容循环插入数据库的方法
Dec 28 Python
Python实现html转换为pdf报告(生成pdf报告)功能示例
May 04 Python
pyqt 实现QlineEdit 输入密码显示成圆点的方法
Jun 24 Python
详解numpy.meshgrid()方法使用
Aug 01 Python
Python使用贪婪算法解决问题
Oct 22 Python
查看jupyter notebook每个单元格运行时间实例
Apr 22 Python
python实现逢七拍腿小游戏的思路详解
May 26 Python
python 如何停止一个死循环的线程
Nov 24 Python
python lambda 表达式形式分析
Apr 03 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 实现的将图片转换为TXT
2015/10/21 PHP
laravel 5.1下php artisan migrate的使用注意事项总结
2017/06/07 PHP
laravel excel 上传文件保存到本地服务器功能
2019/11/14 PHP
动态加载js和css(外部文件)
2013/04/17 Javascript
showModelDialog弹出文件下载窗口的使用示例
2013/11/19 Javascript
JS中对象与字符串的互相转换详解
2016/05/20 Javascript
js实现放大镜特效
2017/05/18 Javascript
浅谈Emergence.js 检测元素可见性的 js 插件
2017/11/18 Javascript
详解vue.js之props传递参数
2017/12/12 Javascript
基于openlayers4实现点的扩散效果
2020/08/17 Javascript
vue+mock.js实现前后端分离
2019/07/24 Javascript
JS中比Switch...Case更优雅的多条件判断写法
2019/09/05 Javascript
微信小程序使用前置摄像头拍照
2020/10/22 Javascript
elementUI同一页面展示多个Dialog的实现
2020/11/19 Javascript
js实现扫雷源代码
2020/11/27 Javascript
[02:38]DOTA2亚洲邀请赛小组赛精彩集锦:Wings完美团击溃对手
2017/03/29 DOTA
[01:01:35]Optic vs paiN 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
[01:02:09]Liquid vs TNC 2019国际邀请赛淘汰赛 胜者组 BO3 第二场 8.21
2020/07/19 DOTA
在Windows系统上搭建Nginx+Python+MySQL环境的教程
2015/12/25 Python
Python3如何解决字符编码问题详解
2017/04/23 Python
Pandas实现数据类型转换的一些小技巧汇总
2018/05/07 Python
Python分割指定页数的pdf文件方法
2018/10/26 Python
Python根据欧拉角求旋转矩阵的实例
2019/01/28 Python
Python将string转换到float的实例方法
2019/07/29 Python
django 将自带的数据库sqlite3改成mysql实例
2020/07/09 Python
Speedo速比涛德国官方网站:世界领先的泳装品牌
2019/08/26 全球购物
大学生创业项目方案
2014/03/08 职场文书
外联部演讲稿
2014/05/24 职场文书
2014学生会工作总结报告
2014/12/02 职场文书
自我检讨报告
2015/01/28 职场文书
element多个表单校验的实现
2021/05/27 Javascript
redis数据结构之压缩列表
2022/03/21 Redis
Redis超详细讲解高可用主从复制基础与哨兵模式方案
2022/04/07 Redis
TypeScript 使用 Tuple Union 声明函数重载
2022/04/07 Javascript
css3属性选择器 “~”(波浪号) “,”(逗号) “+”(加号)和 “>”(大于号)
2022/04/19 HTML / CSS
常用的文件对应的MIME类型汇总
2022/04/26 HTML / CSS