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实现数通设备端口监控示例
Apr 02 Python
python实现获取序列中最小的几个元素
Sep 25 Python
python通过yield实现数组全排列的方法
Mar 18 Python
python实现井字棋游戏
Mar 30 Python
bat和python批量重命名文件的实现代码
May 19 Python
python中使用iterrows()对dataframe进行遍历的实例
Jun 09 Python
Python3 获取一大段文本之间两个关键字之间的内容方法
Oct 11 Python
python中while和for的区别总结
Jun 28 Python
Django关于admin的使用技巧和知识点
Feb 10 Python
wxPython修改文本框颜色过程解析
Feb 14 Python
pycharm运行程序时看不到任何结果显示的解决
Feb 21 Python
pandas to_excel 添加颜色操作
Jul 14 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伪静态页面函数附使用方法
2008/06/20 PHP
PHP和Mysqlweb应用开发核心技术 第1部分 Php基础-1 开始了解php
2011/07/03 PHP
joomla组件开发入门教程
2016/05/04 PHP
javascript 写类方式之七
2009/07/05 Javascript
javaScript 判断字符串是否为数字的简单方法
2009/07/25 Javascript
基于JQuery的asp.net树实现代码
2010/11/30 Javascript
javascript中直接写php代码的方法
2013/07/31 Javascript
完美的js div拖拽实例代码
2016/09/24 Javascript
js实现打地鼠小游戏
2017/02/13 Javascript
javascript面向对象三大特征之继承实例详解
2019/07/24 Javascript
vue实现移动端H5数字键盘组件使用详解
2020/08/25 Javascript
Vue全局使用less样式,组件使用全局样式文件中定义的变量操作
2020/10/21 Javascript
在Django框架中编写Contact表单的教程
2015/07/17 Python
python Selenium爬取内容并存储至MySQL数据库的实现代码
2017/03/16 Python
Python Socket使用实例
2017/12/18 Python
Python进度条实时显示处理进度的示例代码
2018/01/30 Python
python+unittest+requests实现接口自动化的方法
2018/11/29 Python
通过python的matplotlib包将Tensorflow数据进行可视化的方法
2019/01/09 Python
详解python执行shell脚本创建用户及相关操作
2019/04/11 Python
Python中使用threading.Event协调线程的运行详解
2020/05/02 Python
Python+PyQt5实现灭霸响指功能
2020/05/25 Python
Python 实现3种回归模型(Linear Regression,Lasso,Ridge)的示例
2020/10/15 Python
HTML5 Canvas 实现K线图的示例代码
2019/12/23 HTML / CSS
西班牙英格列斯百货英国官网:El Corte Inglés英国
2017/10/30 全球购物
美国木工工具和用品商店:Woodcraft
2019/10/30 全球购物
通用C#笔试题附答案
2016/11/26 面试题
简述安装Slackware Linux系统的过程
2012/05/08 面试题
《跟踪台风的卫星》教学反思
2014/04/10 职场文书
《生命 生命》教学反思
2014/04/19 职场文书
2014年前台文员工作总结
2014/12/08 职场文书
2016年植树节红领巾广播稿
2015/12/17 职场文书
CSS 还能这样玩?奇思妙想渐变的艺术
2021/04/27 HTML / CSS
详解mysql三值逻辑与NULL
2021/05/19 MySQL
Redis入门教程详解
2021/08/30 Redis
Python中非常使用的6种基本变量的操作与技巧
2022/03/22 Python
【DOTA2】当街暴打?PSG LGD vs VG - DPC 2022 WINTER TOUR CN
2022/04/02 DOTA