在python编程中,少不了对文件的操作,那么在并发情况下,多个进程如何对同一文件进行读写操作呢?这就要用到文件锁了。

关于文件锁的的知识,需要参考UNIX环境编程,这里只简要介绍概念。python的文件锁目前使用的是fcntl这个库,它实际上为 Unix上的ioctl,flock和fcntl 函数提供了一个接口。python通过调用fcntl.flock()函数对文件加锁。

对fcntl.flock()函数的说明:

linux的flock() 的函数原型如下所示:

int flock(int fd, int operation);

其中,参数fd表示文件描述符;参数operation指定要进行的锁操作,该参数的取值有如下几种:

  • LOCK_SH:表示要创建一个共享锁,在任意时间内,一个文件的共享锁可以被多个进程拥有;
  • LOCK_EX:表示创建一个排他锁,在任意时间内,一个文件的排他锁只能被一个进程拥有;
  • LOCK_UN:表示删除该进程创建的锁;
  • LOCK_MAND:它主要是用于共享模式强制锁,它可以与 LOCK_READ 或者 LOCK_WRITE联合起来使用,从而表示是否允许并发的读操作或者并发的写操作;

通常情况下,如果加锁请求不能被立即满足,那么系统调用flock()会阻塞当前进程。比如,进程想要请求一个排他锁,但此时,已经由其他进程获取了这个锁,那么该进程将会被阻塞。如果想要在没有获得这个排他锁的情况下不阻塞该进程,可以将LOCK_NB 和 LOCK_SH 或者 LOCK_EX 联合使用,那么系统就不会阻塞该进程。flock()所加的锁会对整个文件起作用。

示例代码

# coding=utf-8
import fcntl
import os, time
import uuidFILE = "counter.txt"if not os.path.exists(FILE):# create the counter file if it doesn't existfile = open(FILE, "w")vnc_line = '123cajfg: 127.0.0.1:15900'file.write(vnc_line + '\n')file.close()for i in range(5):file = open(FILE, "a+")     #由于flock生成的是劝告锁,不能阻止进程对文件的操作,所以这里可以正常打开文件fcntl.flock(file.fileno(), fcntl.LOCK_EX)   #为了避免同时操作文件,需要程序自己来检查该文件是否已经被加锁。这里如果检查到加锁了,进程会被阻塞print 'acquire lock'now_port = int(file.readlines()[-1].split(':')[-1])new_port = now_port + 1token = str(uuid.uuid4())# file.seek(0)vnc_line = ':'.join([token, ' 127.0.0.1', str(new_port)])file.write(vnc_line + '\n')print os.getpid(), "=>", new_porttime.sleep(10)file.close() # unlocks the fileprint 'release lock'time.sleep(2)

在多个终端中启动上面的程序,会发现它们相互阻塞。

注意:

  1. 对于文件的 close() 操作会使文件锁失效;
  2. 同理,进程结束后文件锁失效;
  3. flock() 的 LOCK_EX是“劝告锁”,系统内核不会强制检查锁的状态,需要在代码中进行文件操作的地方显式检查才能生效。

Python的文件锁使用相关推荐

  1. python os 文件锁_python 中给文件加锁——fcntl模块

    如果没有fcntl模块则用 sudo pip install fcntl安装 模块简单说明: 打开文件,不存在则创建之 f = open('./test','w') fcntl.flock(f,fcn ...

  2. python filelock 文件锁_详解进程文件锁FileLock

    import java.io.FileNotFoundException; import java.io.IOException; import java.io.RandomAccessFile; i ...

  3. python文件锁概念

    python文件在进行读写的时候,多进程读写的时候需要用到文件锁概念 这需要用到python兼容性编程 这里需要要到安装文件类库: pylibs:https://github.com/tav/pyli ...

  4. Python使用fcntl文件锁

    前言 Python语言中的文件锁可以使用 fcntl 库,它实际上是对Unix系统上的 fcntl 和 ioctl 函数提供了一个接口.官网描述中是这样形容的: This module perform ...

  5. python __file__怎么实现_python lockfile(文件锁)

    一个lock file的python实现 如果多个进程,或者多个独立程序要写同一个文件,那么就存在大家同时写文件的可能,这就不妙了,数据可能会出问题.最近在网上找到一个开源的python实现,有效简洁 ...

  6. python windows 下设置文件锁、多线程

    在python 环境的Lib文件夹下新建fcntl.py文件,在其中写入下面的内容: fcntl.py是linux平台上python自带的包,windows平台下没有,所以需要自己设计一份,让wind ...

  7. python 文件锁 portalocker

    多进程代码需要对同一个文件写入,需要用到文件锁fcntl.而windows下没有对应的fcntl module.侥幸发现portalocker可以用于文件加锁. import portalocker ...

  8. Python 标准库之 fcntl

    在 linux 环境下用 Python 进行项目开发过程中经常会遇到多个进程对同一个文件进行读写问题,而此时就要对文件进行加锁控制,在 Python 的 linux 版本下有个 fcntl 模块可以方 ...

  9. 嘿!我用python帮我干这些事

    python 无疑是当下火上天的语言,但是我们又不拿来工作,那么能拿来干啥呢?我是这么干的. 1. 平时工作开发用不上,就当个计算器吧! python # 加减乘除 >>> (3 + ...

最新文章

  1. codeblocks安装及使用教程(手把手傻瓜式教学)
  2. P1083 借教室(标记永久化线段树/二分+前缀和)难度⭐⭐⭐★
  3. qt chart 如何使网格填满整个窗口_Qt实现截屏的关键函数
  4. SpringMVC框架 学习DAY_01:框架概括 / 简易应用 / 核心执行流程图 /在框架下显示HTML模板页面/ 接受请求
  5. Fedora 8中驱动ASUS6摄像头
  6. 按应用领域来划分,电话光端机主要分为哪几类
  7. Bash脚本教程之字符串操作
  8. python怎么发送邮件_在Python如何使用SMTP发送邮件
  9. python怎么输入两个数然后求差值_python两个日期之间天差值获取
  10. php实现把es6转为es5,使用webpack将ES6转化ES5的实现方法
  11. HDR高动态压缩【MATLAB代码】
  12. vCenter6.0配置一:配置分布式交换机
  13. web.xml 配置 contextConfigLocation
  14. 极简代码(五)—— 斐波那契数列
  15. 【java笔记】静态static关键字
  16. mysql 隐秘后门_Phpstudy被暴存在隐藏后门-检查方法
  17. 特征选择relief算法介绍
  18. matlab 求导的一个简单程序
  19. python批量创建文件与批量创建文件夹
  20. 福利:推荐一个免费的抠图网站

热门文章

  1. Mysql for Linux安装配置之——二进制安装
  2. Window命令行工具操作文件
  3. JS引擎查找属性的原理
  4. 【Android】Error:Execution failed for task ':app:lint'
  5. Yii2性能优化之:缓存依赖
  6. linux技能点七 shell
  7. 配置不当导致无法加载odoo-10.0模块
  8. python API url 级联生成
  9. 润乾报表使用问题总结
  10. 方法的运用_运用正确管理方法缩减库存,助力企业发展