对Python的多进程锁的使用方法详解


Posted in Python onFebruary 18, 2019

很多时候,我们需要在多个进程中同时写一个文件,如果不加锁机制,就会导致写文件错乱

这个时候,我们可以使用multiprocessing.Lock()

我一开始是这样使用的:

import multiprocessing
lock = multiprocessing.Lock()
class MatchProcess(multiprocessing.Process):
  def __init__(self, threadId, mfile, lock):
    multiprocessing.Process.__init__(self)
    self.threadId = threadId
    self.mfile = mfile
    self.lock = lock
  def run(self):
    while True:
       self.lock.acquire()
       try:
         self.mfile.write('111111111111111111' + '\n')
       finally:
         self.lock.release()
 
if __name__ == '__main__':
  mf = open('test.lst', 'w')
  for i in range(15):
    p = MatchProcess(i, mf, lock)
    p.start()

发现这种方式,锁并没有起作用, 文件内容依然出现了错乱(注意,我这里写的1111是示例,我的代码实际写的其他内容)

所以这种方式,虽然lock通过参数传到了每个进程中,但是我们知道进程之间是不共享内存的,所以我理解应该是每个进程获得的锁其实是不同的, 所以无法对写文件起到加锁的效果

进程池是否可行呢,于是做了如下尝试

def run(line):
  lock.acquire()
    try:
      mfile.write('111111111111111111' + '\n')
  finally:
    lock.release()
sf = open('test.lst', 'r')
data_lst = list()
for line in sf: 
  line = line.strip()
  data_lst.append(line)
pool = Pool(15)
pool.map_async(run, data_lst) #map_async方法会将data_lst这个可迭代的对象里面的每个元素依次传入run方法来执行
pool.close()
pool.join()
print 'over'

但是注意:

pool.close()
pool.join()

这两行代码必不可少,否则,主进程执行完毕后会退出,导致整个进程结束

所以在整个进程全部执行完毕后,才会打印出over

但是这种方式,发现,锁仍然不起作用

最后采用了如下方式:

def run(line):
  mfile = open('test2.lst', 'a')
  lock.acquire()
  try:
    mfile.write('111111111111111111' + '\n')
  finally:
    lock.release()
 
sf = open('test.lst', 'r')
data_lst = list()
for line in sf: 
  line = line.strip()
  data_lst.append(line)
 
pList = []
for line in line_lst:
  p = multiprocessing.Process(target=run, args=(line, lock))
  p.start()
  pList.append(p)
 
for p in pList:
  p.join()

是亲测发现,这种方式,锁的确起作用了,在每次写入数据量很大的情况下,速度很慢

但是一个比较恶心的问题是,我一开始试图将文件打开后通过Process对象的args参数传入到run方法中,但是发现数据无法写入到文件中,见鬼,这个问题我还没搞明白

无耐,只能采取上面的笨方法,在每次写入的时候打开然后写入,这肯定不是明智的做法,如果有更好的办法,请留言我

也就是说,文件打开后传入,是无效的,那么可以将文件名传入,然后在run方法中每次写的时候先打开,写入后关闭应该也是可行的。

但是为什么我文章采用的第一种方式,也是文件打开后传入,却是可行的。

以上这篇对Python的多进程锁的使用方法详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python利用装饰器进行运算的实例分析
Aug 04 Python
python不换行之end=与逗号的意思及用途
Nov 21 Python
Python机器学习k-近邻算法(K Nearest Neighbor)实例详解
Jun 25 Python
Python定义一个跨越多行的字符串的多种方法小结
Jul 19 Python
Windows 安装 Anaconda3+PyCharm的方法步骤
Jun 13 Python
python爬虫解决验证码的思路及示例
Aug 01 Python
python3获取url文件大小示例代码
Sep 18 Python
Python list与NumPy array 区分详解
Nov 06 Python
如何写python的配置文件
Jun 07 Python
哪些是python中web开发框架
Jun 17 Python
基于Python的一个自动录入表格的小程序
Aug 05 Python
python实现MySQL指定表增量同步数据到clickhouse的脚本
Feb 26 Python
对python中if语句的真假判断实例详解
Feb 18 #Python
python判断文件是否存在,不存在就创建一个的实例
Feb 18 #Python
解决python打不开文件(文件不存在)的问题
Feb 18 #Python
python多线程调用exit无法退出的解决方法
Feb 18 #Python
python多线程并发让两个LED同时亮的方法
Feb 18 #Python
对python 多线程中的守护线程与join的用法详解
Feb 18 #Python
python 多线程重启方法
Feb 18 #Python
You might like
PHP数组相加操作及与array_merge的区别浅析
2016/11/26 PHP
Laravel 实现添加多语言提示信息
2019/10/25 PHP
PHP程序守护进程化实现方法详解
2020/07/16 PHP
jQuery ctrl+Enter shift+Enter实现代码
2010/02/07 Javascript
jQuery获取注册信息并提示实现代码
2013/04/21 Javascript
两个数组去重的JS代码
2013/12/04 Javascript
jQuery Mobile弹出窗、弹出层知识汇总
2016/01/05 Javascript
所见即所得的富文本编辑器bootstrap-wysiwyg使用方法详解
2016/05/27 Javascript
JS针对Array的各种操作汇总
2016/11/29 Javascript
layer弹出层中H5播放器全屏出错的解决方法
2017/02/21 Javascript
利用prop-types第三方库对组件的props中的变量进行类型检测
2017/05/02 Javascript
HTML5开发Kinect体感游戏的实例应用
2017/09/18 Javascript
javascript 缓冲运动框架的实现
2017/09/29 Javascript
JavaScript防止全局变量污染的方法总结
2018/08/02 Javascript
详解vue 数组和对象渲染问题
2018/09/21 Javascript
Nodejs实现多文件夹文件同步
2018/10/17 NodeJs
jquery获取input输入框中的值
2019/11/13 jQuery
javascript操作向表格中动态加载数据
2020/08/27 Javascript
[05:10]2014DOTA2国际邀请赛 通往胜利之匙赛场探秘之旅
2014/07/18 DOTA
python使用rsa加密算法模块模拟新浪微博登录
2014/01/22 Python
Python设计模式之组合模式原理与用法实例分析
2019/01/11 Python
在linux下实现 python 监控usb设备信号
2019/07/03 Python
基于python使用tibco ems代码实例
2019/12/20 Python
python输出结果刷新及进度条的实现操作
2020/07/13 Python
python3访问字典里的值实例方法
2020/11/18 Python
python中uuid模块实例浅析
2020/12/29 Python
什么是重载?CTS、CLS和CLR分别做何解释
2012/05/06 面试题
公司新员工的演讲稿注意事项
2014/01/01 职场文书
11月红领巾广播稿
2014/01/17 职场文书
文明社区申报材料
2014/08/21 职场文书
群众路线四风自我剖析材料
2014/10/08 职场文书
英文商务邀请函范文
2015/01/31 职场文书
教师党员个人总结
2015/02/10 职场文书
应届毕业生求职简历自我评价
2015/03/02 职场文书
学校学习型党组织建设心得体会
2019/06/21 职场文书
JavaScript 事件捕获冒泡与捕获详情
2021/11/11 Javascript