对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 29 Python
python获取当前时间对应unix时间戳的方法
May 15 Python
python 生成器生成杨辉三角的方法(必看)
Apr 10 Python
python编程实现希尔排序
Apr 13 Python
Python判断文件或文件夹是否存在的三种方法
Jul 27 Python
简单的python协同过滤程序实例代码
Jan 31 Python
Ranorex通过Python将报告发送到邮箱的方法
Jan 12 Python
Python中文分词库jieba,pkusegwg性能准确度比较
Feb 11 Python
django ORM之values和annotate使用详解
May 19 Python
python中Mako库实例用法
Dec 31 Python
python requests模块的使用示例
Apr 07 Python
Django对接elasticsearch实现全文检索的示例代码
Aug 02 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生成文件
2007/01/15 PHP
PHP二维数组排序的3种方法和自定义函数分享
2014/04/09 PHP
PHP耦合设计模式实例分析
2018/08/08 PHP
用javascript实现计算两个日期的间隔天数
2007/08/14 Javascript
Cookie 小记
2010/04/01 Javascript
JavaScript初学者应注意的七个细节小结
2012/01/30 Javascript
javascript垃圾收集机制与内存泄漏详细解析
2013/11/11 Javascript
jquery与prototype框架的详细对比
2013/11/21 Javascript
把字符串按照特定的字母顺序进行排序的js代码
2014/01/28 Javascript
原生javascript实现图片滚动、延时加载功能
2015/01/12 Javascript
javascript实现汉字转拼音代码分享
2015/04/20 Javascript
Bootstrap每天必学之缩略图与警示窗
2015/11/29 Javascript
js省市县三级联动效果实例
2020/04/15 Javascript
轻松实现jquery选项卡切换效果
2016/10/10 Javascript
jquery滚动条插件slimScroll使用方法
2017/02/09 Javascript
详解vue组件通信的三种方式
2017/06/30 Javascript
extjs简介_动力节点Java学院整理
2017/07/17 Javascript
微信小程序 websocket 实现SpringMVC+Spring+Mybatis
2017/08/04 Javascript
[06:42]DOTA2每周TOP10 精彩击杀集锦vol.1
2014/06/25 DOTA
[01:54]TI4西雅图DOTA2选手欢迎晚宴 现场报道
2014/07/08 DOTA
Python中几种导入模块的方式总结
2017/04/27 Python
Python collections.defaultdict模块用法详解
2020/06/18 Python
Python numpy矩阵处理运算工具用法汇总
2020/07/13 Python
Django mysqlclient安装和使用详解
2020/09/17 Python
爱尔兰灯和灯具网上商店:Lights.ie
2018/03/26 全球购物
Reebok官方旗舰店:美国知名健身品牌锐步
2019/01/07 全球购物
美国购买体育赛事门票网站:TicketCity
2019/03/06 全球购物
美国花园雕像和家居装饰网上商店:Design Toscano
2019/03/09 全球购物
校园奶茶店创业计划书
2014/01/23 职场文书
入职担保书范文
2014/05/21 职场文书
幼儿园爱国卫生月活动总结
2014/06/30 职场文书
大学生见习期满自我鉴定
2014/09/13 职场文书
2014年小学教师工作总结
2014/11/10 职场文书
师德师风学习材料
2014/12/19 职场文书
jQuery class属性操作addClass()与removeClass()、hasClass()、toggleClass()
2021/03/31 jQuery
详解运行Python的神器Jupyter Notebook
2021/06/03 Python