对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中使用PyQt把网页转换成PDF操作代码实例
Apr 23 Python
python通过post提交数据的方法
May 06 Python
python基于隐马尔可夫模型实现中文拼音输入
Apr 01 Python
浅谈插入排序算法在Python程序中的实现及简单改进
May 04 Python
JS设计模式之责任链模式实例详解
Feb 03 Python
python爬虫神器Pyppeteer入门及使用
Jul 13 Python
在VS2017中用C#调用python脚本的实现
Jul 31 Python
关于sys.stdout和print的区别详解
Dec 05 Python
Python全面分析系统的时域特性和频率域特性
Feb 26 Python
详解如何修改python中字典的键和值
Sep 29 Python
Python实现AES加密,解密的两种方法
Oct 03 Python
python实现一个简单RPC框架的示例
Oct 28 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 日常开发小技巧
2009/09/23 PHP
浅谈laravel数据库查询返回的数据形式
2019/10/21 PHP
代码精简的可以实现元素圆角的js函数
2007/07/21 Javascript
js用图作提交按钮或超连接
2008/03/26 Javascript
js form action动态修改方法
2008/11/04 Javascript
jquery ajax学习笔记2 使用XMLHttpRequest对象的responseXML
2011/10/16 Javascript
Highcharts 非常实用的Javascript统计图demo示例
2013/07/03 Javascript
推荐 21 款优秀的高性能 Node.js 开发框架
2014/08/18 Javascript
javascript中setTimeout和setInterval的unref()和ref()用法示例
2014/11/26 Javascript
JS简单计算器实例
2015/01/20 Javascript
jQuery扁平化风格下拉框美化插件FancySelect使用指南
2015/02/10 Javascript
javascript中利用柯里化函数实现bind方法
2016/04/29 Javascript
基于jquery实现三级下拉菜单
2016/05/10 Javascript
Bootstrap Metronic完全响应式管理模板之菜单栏学习笔记
2016/07/08 Javascript
javaScript实现滚动条事件详解
2020/03/24 Javascript
Angular6封装http请求的步骤详解
2018/08/13 Javascript
详解超简单的react服务器渲染(ssr)入坑指南
2019/02/28 Javascript
vue项目前端知识点整理【收藏】
2019/05/13 Javascript
JS判断数组是否包含某元素实现方法汇总
2020/06/24 Javascript
Python的Urllib库的基本使用教程
2015/04/30 Python
Python设计模式编程中解释器模式的简单程序示例分享
2016/03/02 Python
matplotlib 输出保存指定尺寸的图片方法
2018/05/24 Python
Python爬虫beautifulsoup4常用的解析方法总结
2019/02/25 Python
Python Opencv实现图像轮廓识别功能
2020/03/23 Python
对pyqt5多线程正确的开启姿势详解
2019/06/14 Python
Python监控服务器实用工具psutil使用解析
2019/12/19 Python
Python使用ElementTree美化XML格式的操作
2020/03/06 Python
使用CSS Grid布局实现网格的流动
2014/12/30 HTML / CSS
kmart凯马特官网:美国最大的打折零售商和全球最大的批发商之一
2016/11/17 全球购物
2014年教师培训的自我评价
2014/01/03 职场文书
幼儿园实习生辞职信
2014/01/20 职场文书
应用数学专业求职信
2014/03/14 职场文书
关于环保的活动方案
2014/08/25 职场文书
物业管理委托协议(2篇)
2014/09/23 职场文书
关于五一放假的通知
2015/08/18 职场文书
python实现简单倒计时功能
2021/04/21 Python