对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使用urllib2模块获取gravatar头像实例
Dec 18 Python
Python用GET方法上传文件
Mar 10 Python
Python程序中使用SQLAlchemy时出现乱码的解决方案
Apr 24 Python
Python操作MongoDB数据库PyMongo库使用方法
Apr 27 Python
Python的几个高级语法概念浅析(lambda表达式闭包装饰器)
May 28 Python
Python求两个圆的交点坐标或三个圆的交点坐标方法
Nov 07 Python
Python eval的常见错误封装及利用原理详解
Mar 26 Python
Python中将两个或多个list合成一个list的方法小结
May 12 Python
PYQT5设置textEdit自动滚屏的方法
Jun 14 Python
keras做CNN的训练误差loss的下降操作
Jun 22 Python
浅谈python处理json和redis hash的坑
Jul 16 Python
python 单机五子棋对战游戏
Apr 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
什么是短波收听SWL
2021/03/01 无线电
理解php Hash函数,增强密码安全
2011/02/25 PHP
php后退一页表单内容保存实现方法
2012/06/17 PHP
PHP输出数组中重名的元素的几种处理方法
2012/09/05 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(六)
2014/06/23 PHP
Javascript String对象扩展HTML编码和解码的方法
2009/06/02 Javascript
js 多浏览器分别判断代码
2010/04/01 Javascript
javascript 兼容所有浏览器的DOM扩展功能
2012/08/01 Javascript
模拟多级复选框效果的jquery代码
2013/08/13 Javascript
js使用for循环与innerHTML获取选中tr下td值
2014/09/26 Javascript
Javascript学习笔记之相等符号与严格相等符号
2014/11/23 Javascript
纯js实现仿QQ邮箱弹出确认框
2015/04/29 Javascript
JavaScript实现标题栏文字轮播效果代码
2015/10/24 Javascript
jQuery选择器基础入门教程
2016/05/10 Javascript
Angular指令封装jQuery日期时间插件datetimepicker实现双向绑定示例
2017/01/22 Javascript
浅谈关于axios和session的一些事
2017/07/13 Javascript
微信小程序scroll-view组件实现滚动动画
2018/01/31 Javascript
vue 项目 iOS WKWebView 加载
2019/04/17 Javascript
详解微信小程序自定义组件的实现及数据交互
2019/07/22 Javascript
Vue请求java服务端并返回数据代码实例
2019/11/28 Javascript
JS图片懒加载的优点及实现原理
2020/01/10 Javascript
[07:26]2015国际邀请赛第二日TOP10集锦
2015/08/06 DOTA
python使用sorted函数对列表进行排序的方法
2015/04/04 Python
pandas的排序和排名的具体使用
2019/07/31 Python
使用Keras预训练模型ResNet50进行图像分类方式
2020/05/23 Python
HTML5+css3:3D旋转木马效果相册
2017/01/03 HTML / CSS
IRO美国官网:法国服装品牌
2018/03/06 全球购物
英国手机壳购买网站:Case Hut
2019/04/11 全球购物
安全生产管理合理化建议书
2014/03/12 职场文书
学校节能减排方案
2014/06/13 职场文书
2014年打非治违工作总结
2014/11/13 职场文书
一年级小学生评语大全
2014/12/25 职场文书
麦田里的守望者读书笔记
2015/06/30 职场文书
《思路决定出路》读后感3篇
2019/12/11 职场文书
redis 限制内存使用大小的实现
2021/05/08 Redis
MySQL连表查询分组去重的实现示例
2021/07/01 MySQL