对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 中文字符串的处理实现代码
Oct 25 Python
Python内置数据结构与操作符的练习题集锦
Jul 01 Python
python用Pygal如何生成漂亮的SVG图像详解
Feb 10 Python
python实现内存监控系统
Mar 07 Python
如何在python字符串中输入纯粹的{}
Aug 22 Python
Window 64位下python3.6.2环境搭建图文教程
Sep 19 Python
对python操作kafka写入json数据的简单demo分享
Dec 27 Python
零基础学Python之前需要学c语言吗
Jul 21 Python
python实现sm2和sm4国密(国家商用密码)算法的示例
Sep 26 Python
Python collections模块的使用方法
Oct 09 Python
python3爬虫中多线程的优势总结
Nov 24 Python
matplotlib自定义鼠标光标坐标格式的实现
Jan 08 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&mysql(一)
2006/10/09 PHP
教你如何用php实现LOL数据远程获取
2014/06/10 PHP
PHP连续签到功能实现方法详解
2019/12/04 PHP
JS与框架页的操作代码
2010/01/17 Javascript
JS注册/移除事件处理程序(ExtJS应用程序设计实战)
2013/05/07 Javascript
jquery实现图片左右间隔滚动特效(可自动播放)
2013/05/08 Javascript
jQuery动画效果-fadeIn fadeOut淡入浅出示例代码
2013/08/28 Javascript
5分钟理解JavaScript中this用法分享
2013/11/09 Javascript
浅析hasOwnProperty方法的应用
2013/11/20 Javascript
JS关闭窗口与JS关闭页面的几种方法小结
2013/12/17 Javascript
js计算任意值之间随机数的方法
2015/01/16 Javascript
jQuery常用数据处理方法小结
2015/02/20 Javascript
使用纯javascript实现放大镜效果
2015/03/18 Javascript
实例分析浏览器中“JavaScript解析器”的工作原理
2016/12/12 Javascript
JS返回只包含数字类型的数组实例分析
2016/12/16 Javascript
jQuery拖拽通过八个点改变div大小
2020/11/29 Javascript
layui的table中显示图片方法
2018/08/17 Javascript
nodejs使用socket5进行代理请求的实现
2020/02/21 NodeJs
vue.js watch经常失效的场景与解决方案
2021/01/07 Vue.js
Python爬虫框架Scrapy实战之批量抓取招聘信息
2015/08/07 Python
使用Pyinstaller的最新踩坑实战记录
2017/11/08 Python
Python自动化之数据驱动让你的脚本简洁10倍【推荐】
2019/06/04 Python
选择Python写网络爬虫的优势和理由
2019/07/07 Python
TensorFlow梯度求解tf.gradients实例
2020/02/04 Python
python 解决mysql where in 对列表(list,,array)问题
2020/06/06 Python
美国睫毛、眉毛精华液领导品牌:RevitaLash Cosmetics
2018/03/26 全球购物
菲律宾票务网站:StubHub菲律宾
2018/04/21 全球购物
校园创业策划书
2014/01/14 职场文书
2014年公司迎新年活动方案
2014/02/24 职场文书
文化与传播毕业生求职信
2014/03/09 职场文书
幼儿老师求职信
2014/06/30 职场文书
群众路线个人整改措施
2014/10/24 职场文书
学校党员干部承诺书
2015/05/04 职场文书
vue实现同时设置多个倒计时
2021/05/20 Vue.js
Python实现提取PDF简历信息并存入Excel
2022/04/02 Python
关于windows server 2012 DC 环境 重启后蓝屏代码:0xc00002e2的问题
2022/05/25 Servers