对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之从格式化表达式到方法
Sep 28 Python
Django 添加静态文件的两种实现方法(必看篇)
Jul 14 Python
Python即时网络爬虫项目启动说明详解
Feb 23 Python
Ubuntu下使用Python实现游戏制作中的切分图片功能
Mar 30 Python
Python实现读取txt文件并转换为excel的方法示例
May 17 Python
对Python 获取类的成员变量及临时变量的方法详解
Jan 22 Python
基于python实现高速视频传输程序
May 05 Python
Python OpenCV中的resize()函数的使用
Jun 20 Python
Python turtle库的画笔控制说明
Jun 28 Python
Python爬虫设置ip代理过程解析
Jul 20 Python
PyQt QMainWindow的使用示例
Mar 24 Python
教你利用python实现企业微信发送消息
May 23 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 伪静态技术原理以及突破原理实现介绍
2013/07/12 PHP
php显示指定目录下子目录的方法
2015/03/20 PHP
分享php分页的功能模块
2015/06/16 PHP
php自定义时间转换函数示例
2016/12/07 PHP
PHP实现RTX发送消息提醒的实例代码
2017/01/03 PHP
事件委托与阻止冒泡阻止其父元素事件触发
2014/09/02 Javascript
JavaScript的null和undefined区别示例介绍
2014/09/15 Javascript
jQuery的Scrollify插件实现滑动到页面下一节点
2015/07/05 Javascript
BootStrap 智能表单实战系列(二)BootStrap支持的类型简介
2016/06/13 Javascript
JS中实现函数return多个返回值的实例
2017/02/21 Javascript
AjaxUpLoad.js实现文件上传
2018/03/05 Javascript
vue移动端轻量级的轮播组件实现代码
2018/07/12 Javascript
JS高阶函数原理与用法实例分析
2019/01/15 Javascript
详解原生JS回到顶部
2019/03/25 Javascript
vue.js实现备忘录demo
2019/06/26 Javascript
mpvue实现小程序签到金币掉落动画(api实现)
2019/10/17 Javascript
jQuery插件simplePagination的使用方法示例
2020/04/28 jQuery
vue prop传值类型检验方式
2020/07/30 Javascript
AI人工智能 Python实现人机对话
2017/11/13 Python
Python分析学校四六级过关情况
2017/11/22 Python
Python实现的井字棋(Tic Tac Toe)游戏示例
2018/01/31 Python
python PyAutoGUI 模拟鼠标键盘操作和截屏功能
2019/08/04 Python
Python操作Mongodb数据库的方法小结
2019/09/10 Python
150行python代码实现贪吃蛇游戏
2020/04/24 Python
python中Pexpect的工作流程实例讲解
2021/03/02 Python
Html5之webcoekt播放JPEG图片流
2020/09/22 HTML / CSS
.NET概念性的面试题
2012/02/29 面试题
土木工程建筑专业毕业生求职信
2013/10/21 职场文书
酒店前台接待岗位职责
2013/12/03 职场文书
车间班组长的职责
2013/12/13 职场文书
就业自我评价
2014/02/04 职场文书
印刷技术专业自荐信
2014/09/18 职场文书
暑期社会实践个人总结
2015/03/06 职场文书
工厂仓库管理员岗位职责
2015/04/09 职场文书
大国崛起英国观后感
2015/06/02 职场文书
java泛型通配符详解
2021/07/25 Java/Android