对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备份文件的脚本
Aug 11 Python
Python使用htpasswd实现基本认证授权的例子
Jun 10 Python
Python文件夹与文件的相关操作(推荐)
Jul 25 Python
一个基于flask的web应用诞生 组织结构调整(7)
Apr 11 Python
运行django项目指定IP和端口的方法
May 14 Python
Python面向对象之继承和组合用法实例分析
Aug 27 Python
朴素贝叶斯Python实例及解析
Nov 19 Python
Python玩转加密的技巧【推荐】
May 13 Python
python 在某.py文件中调用其他.py内的函数的方法
Jun 25 Python
Django2 连接MySQL及model测试实例分析
Dec 10 Python
使用Python爬虫库requests发送表单数据和JSON数据
Jan 25 Python
python 实现图片修复(可用于去水印)
Nov 19 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从数组中随机抽取一些元素的代码
2012/11/05 PHP
PHP安全的URL字符串base64编码和解码
2014/06/19 PHP
php中socket通信机制实例详解
2015/01/03 PHP
PHP读取txt文本文件并分页显示的方法
2015/03/11 PHP
PHP概率计算函数汇总
2015/09/13 PHP
JavaScript CSS菜单功能 改进版
2008/12/20 Javascript
全面详细的jQuery常见开发技巧手册
2016/02/21 Javascript
Struts2+jquery.form.js实现图片与文件上传的方法
2016/05/05 Javascript
JS中IP地址与整数相互转换的实现代码
2017/04/10 Javascript
vue.js 使用v-if v-else发现没有执行解决办法
2017/05/15 Javascript
简单实现js放大镜效果
2017/07/24 Javascript
Webpack 4.x搭建react开发环境的方法步骤
2018/08/15 Javascript
jquery获取img的src值实例介绍
2019/01/16 jQuery
在mpvue框架中使用Vant WeappUI组件库的注意事项【推进】
2019/06/09 Javascript
vue.js中ref及$refs的使用方法解析
2019/10/08 Javascript
vue项目,代码提交至码云,iconfont的用法说明
2020/07/30 Javascript
[05:59]2018DOTA2国际邀请赛寻真——只为胜利的Secret
2018/08/13 DOTA
浅析Python 中整型对象存储的位置
2016/05/16 Python
Python基于递归算法实现的走迷宫问题
2017/08/04 Python
python flask中静态文件的管理方法
2018/03/20 Python
python 实现矩阵上下/左右翻转,转置的示例
2019/01/23 Python
对dataframe数据之间求补集的实例详解
2019/01/30 Python
Django 拆分model和view的实现方法
2019/08/16 Python
python 并发编程 阻塞IO模型原理解析
2019/08/20 Python
python opencv图片编码为h264文件的实例
2019/12/12 Python
CSS3 真的会替代 SCSS 吗
2021/03/09 HTML / CSS
台湾旅游网站:雄狮旅游网
2017/08/16 全球购物
英国最专业的健身器材供应商之一:Best Gym Equipment
2017/12/22 全球购物
分厂厂长岗位职责
2013/12/29 职场文书
会计专业毕业生求职信分享
2014/01/03 职场文书
致铅球运动员广播稿精选
2014/01/12 职场文书
刚毕业大学生自荐信范文
2014/02/20 职场文书
高中升旗仪式主持词
2015/07/03 职场文书
2015年国庆放假通知范文
2015/08/18 职场文书
利用Python实现Picgo图床工具
2021/11/23 Python
html原生table实现合并单元格以及合并表头的示例代码
2023/05/07 HTML / CSS