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

 更新时间:2019年02月18日 14:27:38   作者:田野上的希望  
今天小编就为大家分享一篇对Python的多进程锁的使用方法详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

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

这个时候,我们可以使用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自动化脚本(小结)

    每天你都可能会执行许多重复的任务,例如阅读新闻、发邮件、查看天气、打开书签、清理文件夹等等,本文主要介绍了Python自动化脚本,具有一定的参考价值,感兴趣的可以了解一下
    2022-07-07
  • python库umap有效地揭示高维数据的结构和模式初探

    python库umap有效地揭示高维数据的结构和模式初探

    这篇文章主要介绍了python库umap有效地揭示高维数据的结构和模式初探,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01
  • Python3里的super()和__class__使用介绍

    Python3里的super()和__class__使用介绍

    这篇文章主要介绍了Python3里的super()和__class__使用介绍,本文用实例讲解了这两个方法之间的关系,需要的朋友可以参考下
    2015-04-04
  • python3.4用循环往mysql5.7中写数据并输出的实现方法

    python3.4用循环往mysql5.7中写数据并输出的实现方法

    下面小编就为大家带来一篇python3.4用循环往mysql5.7中写数据并输出的实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • jupyter lab无法导入graphviz模块方式

    jupyter lab无法导入graphviz模块方式

    今天小编就为大家分享一篇jupyter lab无法导入graphviz模块方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-02-02
  • Django发送邮件功能实例详解

    Django发送邮件功能实例详解

    在本篇文章里小编给大家整理了关于Django发送邮件功能的详细内容,有需要的朋友们可以参考学习下。
    2019-09-09
  • PyTorch的深度学习入门之PyTorch安装和配置

    PyTorch的深度学习入门之PyTorch安装和配置

    这篇文章主要介绍了PyTorch的深度学习入门之PyTorch安装和配置,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-06-06
  • Python pandas中apply函数简介以及用法详解

    Python pandas中apply函数简介以及用法详解

    apply()函数是pandas里面所有函数中自由度最高的函数, apply()函数的参数是一个函数指针,这里可以使用lambda表达式帮助简化代码,下面这篇文章主要给大家介绍了关于Python pandas中apply函数简介以及用法的相关资料,需要的朋友可以参考下
    2022-09-09
  • Python多进程编程技术实例分析

    Python多进程编程技术实例分析

    这篇文章主要介绍了Python多进程编程技术,包括了线程、队列、同步等概念及相关的技巧总结,需要的朋友可以参考下
    2014-09-09
  • Python 如何实时向文件写入数据(附代码)

    Python 如何实时向文件写入数据(附代码)

    这篇文章主要介绍了Python 如何实时向文件写入数据(附代码),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07

最新评论