对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中的函数编程
Apr 13 Python
Python将多份excel表格整理成一份表格
Jan 03 Python
matplotlib作图添加表格实例代码
Jan 23 Python
python OpenCV学习笔记之绘制直方图的方法
Feb 08 Python
python模块smtplib学习
May 22 Python
Python 读写文件的操作代码
Sep 20 Python
PythonWeb项目Django部署在Ubuntu18.04腾讯云主机上
Apr 01 Python
对pyqt5中QTabWidget的相关操作详解
Jun 21 Python
PyQt5+Pycharm安装和配置图文教程详解
Mar 24 Python
如何理解python中数字列表
May 29 Python
如何利用python进行时间序列分析
Aug 04 Python
python绘制分布折线图的示例
Sep 24 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实现的下载css文件中的图片的代码
2010/02/08 PHP
PHP Socket 编程
2010/04/09 PHP
用PHP的超级变量$_GET获取HTML表单(Form) 数据
2011/05/07 PHP
采用ThinkPHP中F方法实现快速缓存实例
2014/06/13 PHP
PHP获取文件的MD5值并判断是否被修改的例子
2014/06/19 PHP
php限制文件下载速度的代码
2015/10/20 PHP
yii使用activeFileField控件实现上传文件与图片的方法
2015/12/28 PHP
PHP goto语句用法实例
2019/08/06 PHP
通用于ie和firefox的函数 GetCurrentStyle (obj, prop)
2006/12/27 Javascript
jquery实现弹出窗口效果的实例代码
2013/11/28 Javascript
如何改进javascript代码的性能
2015/04/02 Javascript
jQuery插件jquery-barcode实现条码打印的方法
2015/11/25 Javascript
AngularJS之自定义服务详解(factory、service、provider)
2017/04/14 Javascript
详解AngularJS 模块化
2017/06/14 Javascript
VUEJS 2.0 子组件访问/调用父组件的实例
2018/02/10 Javascript
利用JS动态生成隔行换色HTML表格的两种方法
2018/10/09 Javascript
简单了解小程序+node梳理登陆流程
2019/06/24 Javascript
JS回调函数简单易懂的入门实例分析
2019/09/29 Javascript
JavaScript进阶(四)原型与原型链用法实例分析
2020/05/09 Javascript
Jquery cookie插件实现原理代码解析
2020/08/04 jQuery
Python单元测试框架unittest简明使用实例
2015/04/13 Python
Python数据结构之双向链表的定义与使用方法示例
2018/01/16 Python
python 实现数组list 添加、修改、删除的方法
2018/04/04 Python
对python遍历文件夹中的所有jpg文件的实例详解
2018/12/08 Python
Python ini文件常用操作方法解析
2020/04/26 Python
Python selenium模拟手动操作实现无人值守刷积分功能
2020/05/13 Python
Python新建项目自动添加介绍和utf-8编码的方法
2020/12/26 Python
Roxy荷兰官方网站:冲浪、滑雪板、服装和配件
2019/10/22 全球购物
物业管理应届生求职信
2013/10/28 职场文书
硕士研究生自我鉴定
2013/11/08 职场文书
地震捐款倡议书
2014/08/29 职场文书
重阳节演讲稿:尊敬帮助老人 弘扬传统美德
2014/09/25 职场文书
宣传稿格式范文
2015/07/23 职场文书
Canvas跟随鼠标炫彩小球的实现
2021/04/11 Javascript
Django debug为True时,css加载失败的解决方案
2021/04/24 Python
Python中的套接字编程是什么?
2021/06/21 Python