对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 相关文章推荐
详解duck typing鸭子类型程序设计与Python的实现示例
Jun 03 Python
Python黑魔法@property装饰器的使用技巧解析
Jun 16 Python
python将ansible配置转为json格式实例代码
May 15 Python
Python实现一个简单的验证码程序
Nov 03 Python
Python基本数据结构之字典类型dict用法分析
Jun 08 Python
python获取全国城市pm2.5、臭氧等空气质量过程解析
Oct 12 Python
浅谈tensorflow中Dataset图片的批量读取及维度的操作详解
Jan 20 Python
tensorflow保持每次训练结果一致的简单实现
Feb 17 Python
Python实现链表反转的方法分析【迭代法与递归法】
Feb 22 Python
python如何支持并发方法详解
Jul 25 Python
Pytho爬虫中Requests设置请求头Headers的方法
Sep 22 Python
Pycharm中使用git进行合作开发的教程详解
Nov 17 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
火影忍者:三大瞳力之一的白眼,为什么没有写轮眼那么出色?
2020/03/02 日漫
PHP语法速查表
2006/12/06 PHP
如何使用PHP往windows中添加用户
2006/12/06 PHP
PHP URL地址获取函数代码(端口等) 推荐
2010/05/15 PHP
分享8个Laravel模型时间戳使用技巧小结
2020/02/12 PHP
javascript背投广告代码的完善
2008/04/08 Javascript
JS 中document.URL 和 windows.location.href 的区别
2009/11/11 Javascript
根据对象的某一属性进行排序的js代码(如:name,age)
2010/08/10 Javascript
jQuery ready函数滥用分析
2011/02/16 Javascript
javascript+xml实现简单图片轮换(只支持IE)
2012/12/23 Javascript
js与运算符和或运算符的妙用
2014/02/14 Javascript
Javascript实现图片轮播效果(一)让图片跳动起来
2016/02/17 Javascript
JS中对象与字符串的互相转换详解
2016/05/20 Javascript
js canvas实现擦除动画
2016/07/16 Javascript
js实现弹窗暗层效果
2017/01/16 Javascript
Vue通过input筛选数据
2020/10/26 Javascript
基于vue配置axios的方法步骤
2017/11/09 Javascript
vue 微信授权登录解决方案
2018/04/10 Javascript
在Vue项目中用fullcalendar制作日程表的示例代码
2019/08/04 Javascript
js实现上下左右键盘控制div移动
2020/01/16 Javascript
vue-cli3配置favicon.ico和title的流程
2020/10/27 Javascript
Python中的类与对象之描述符详解
2015/03/27 Python
举例详解Python中threading模块的几个常用方法
2015/06/18 Python
python简单操作excle的方法
2018/09/12 Python
Python3实现统计单词表中每个字母出现频率的方法示例
2019/01/28 Python
Python 利用切片从列表中取出一部分使用的方法
2019/02/01 Python
Python time库基本使用方法分析
2019/12/13 Python
python爬取代理IP并进行有效的IP测试实现
2020/10/09 Python
丽笙酒店官方网站:Radisson Hotels
2019/05/07 全球购物
管理学院毕业生自荐信范文
2014/03/10 职场文书
学生检讨书怎么写
2014/10/09 职场文书
个人查摆剖析材料
2014/10/16 职场文书
欢送会主持词
2015/07/01 职场文书
青年人初次创业的“五不要”
2019/08/23 职场文书
使用Golang的channel交叉打印两个数组的操作
2021/04/29 Golang
Python卷积神经网络图片分类框架详解分析
2021/11/07 Python