Python多进程操作同一个文件,文件锁问题
最近工作当中做了一个项目,这个项目主要是操作文件的。
在操作耗时操作的时候,我们一般采用多线程或者多进程。在开发中,如果多个线程需要对文件进行读写操作,就需要用到线程锁或者是文件锁。
使用fcntl
在Linux下,Python的标准库有线程的文件锁,来自fcntl模块。这个模块提供了Unix系统fcntl()和ioctl()的接口。
对于文件锁的操作,主要需要使用fcntl.flock(fd,operation)这个函数。
其中,参数fd表示文件描述符;参数operation指定要进行的锁操作,该参数的取值有如下几种:
- LOCK_SH:表示要穿件一个共享锁,在任意时间内,一个文件的共享锁可以被多个进程拥有。
- LOCK_EX:表示创建一个排它锁,在任意时间内,一个文件的排它锁只能被一个进程拥有
- LOCK_UN:表示删除该进程创建的锁
- LOCK_MAND:它主要是用于共享模式强制锁,它可以与LOCK_READ或者LOCK_WRITE联合起来使用,从而表示是否允许并发的读操作或者并发的写操作。
我这次工作的应用场景是两个py文件操作同一个文本,所以是多进程操作文本。
#!/usr/bin/python
# coding:utf-8 import fcntl
import threading
import time def writetoTxt():
id = threading.currentThread().getName()
with open("aaa.txt", "a") as f:
# fcntl.flock(f.fileno(), fcntl.LOCK_EX) # 加锁
print("{} acquire lock".format(id))
for i in range(10):
f.write('"write from" + str(i) + {} \n'.format(id))
time.sleep(2)
# 在with块外,文件关闭,自动解锁
print("{} exit".format(id))
if __name__ == '__main__':
writetoTxt()

执行结果:
使用文件锁

没有使用文件锁

如果从执行结果出发,我们看不出两者之间的区别,我想应该是写入内容太少了,看不出效果,有时间再研究下。
通过执行界面,我们是可以看出两者的区别的:
使用文件锁
从下面两个图中,我们可以看出,file_lock1.py文件是处于阻塞状态的,但是没有退出。


不使用文件锁
说明这两个进程都不会被阻塞。


注意:
1、文件close之火,文件锁也会失效
2、进程结束后,文件锁也会失效
3、flock()的LOCK_EX是"劝告锁",系统内核不会强制检查锁的状态,需要在代码中进行文件操作的地方显示检查才能生效。
相关资料:
1.Linux中的文件锁的概念及其实现(http://blog.csdn.net/jianhong1990/article/details/26369465)
2.fcntl模块的官方文档(https://docs.python.org/2/library/fcntl.html#fcntl.flock)
建议:
没事还是多看看官方文档吧,能收获很多。
Python多进程操作同一个文件,文件锁问题的更多相关文章
- python中操作csv文件
python中操作csv文件 读取csv improt csv f = csv.reader(open("文件路径","r")) for i in f: pri ...
- Python【操作EXCEL文件】
#Python中,对EXCEL文件的读写操作需要安装.导入几个第三方模块#xlrd模块:只能读取EXCEL文件,不能进行写操作#xlwt模块:只能进行写操作,但是不能是覆盖写操作(也就是修改Excel ...
- Python 3 操作json 文件
背景 json 是一种轻量级的数据交换格式.易于人阅读和编写,同时也易于机器解析和生成. 一般表现形式是一个无序的 键值对 的集合. 资料: 官方文档: https://docs.python.org ...
- python字符串操作、文件操作,英文词频统计预处理
1.字符串操作: 解析身份证号:生日.性别.出生地等. 凯撒密码编码与解码 网址观察与批量生成 解析身份证号:生日.性别.出生地等 def function3(): print('请输入身份证号') ...
- python 多进程操作
由于python 多线程是无法在多核上发挥优势的,所以才用多进程的方式来折中将这个问题解决. from multiprocessing import Pool import os def f(x): ...
- python基础操作_文件读写操作
#文件读写# r只能读不能写,且文件必须存在,w只能写不能读,a只能写不能读# w+是写读模式,清空原文件内容# r+是读写模式,没有清空原文件内容,# 只要有r,文件必须存在,只要有w,都会清空原文 ...
- c# 操作xml文件(读写)
根据项目需求,我们需要记录用户的操作痕迹,当用户下次登录操作同一个文件时,页面显示为用户上一次执行的用户轨迹,我们考虑把用户的历史记录写进xml文件中. 存储的xml数据结构: XML操作类: usi ...
- 第三章:Python基础の函数和文件操作实战
本課主題 Set 集合和操作实战 函数介紹和操作实战 参数的深入介绍和操作实战 format 函数操作实战 lambda 表达式介绍 文件操作函数介紹和操作实战 本周作业 Set 集合和操作实战 Se ...
- Python 深浅copy 和文件操作
深浅copy 1,先看赋值运算. l1 = [1,2,3,['barry','alex']] l2 = l1 l1[0] = 111 print(l1) # [111, 2, 3, ['barry', ...
随机推荐
- 在ExtJS中查看视频
listeners: { render: function() { win.update( '<video src="' + path+ '" width="100 ...
- ES6学习:两个面试题目--关于模板字符串
号称看完就能“让开发飞起来”,不过文中的两个面试题目的知识点并没包括在文中. https://www.jianshu.com/p/287e0bb867ae 文中并没有完整的知识点去完成上面的两道题,这 ...
- 怎样用git上传代码到github以及如何更新代码
上传代码: 1.进入指定文件夹: cd 指定文件夹 2.初始化git仓库: git init 3.将项目所有文件添加到暂存区: git add . 4.提交到仓库: git commit -m &qu ...
- POI对Excel的操作
1. 先导包 commons-io-2.6.jar包,用于对文件的操作. 下载地址:http://commons.apache.org/proper/commons-io/download_io.cg ...
- openXML向Word插入表
表是 Word 中的另一类型的块级内容,它是以行和列排列的一组段落(以及其他块级内容). Word 中的表格通过 tbl 元素定义,该元素类似于 HTML <表格>标记. 表元素指定文档中 ...
- 使用rsync实现不同Linux服务器间目录同步
实现目标: A 服务器上 /opt/web 目录,与B服务器上 /opt/web目录实现同步.即:B主动与A进行同步. OS: Reaht AS4 A Server 192.168.1 ...
- 【Android开源库】 PagerSlidingTabStrip从头到脚
简介 PagerSlidingTabStrip,是我个人经常使用到的一个和ViewPager配合的页面指示器,可以满足开发过程中常用的需求,如类似于今日头条的首页新闻内容导航栏等等,之前自己开发的Ju ...
- java0618
1. java的基本数据类型,各占多少字节? byte 8位 short 16位 int 32位 long 64位 float 32位 double 64位 boolean 1位 char 16位 2 ...
- Python之旅Day12 HTML与CSS
前端CSS与HTML部分 <a href="http://www.baidu.com" target="_Blank">百度</a>_B ...
- Openvswitch手册(2): OpenFlow Controller
我们这一节主要来看Controller Controller有两种: Primary Controller: 真正控制vswitch的flow table,vswitch会保持和contro ...