对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实现机器学习之kNN算法示例
Mar 01 Python
python Spyder界面无法打开的解决方法
Apr 27 Python
django manage.py扩展自定义命令方法
May 27 Python
Python 互换字典的键值对实例
Feb 12 Python
详解Python 解压缩文件
Apr 09 Python
python爬虫 urllib模块发起post请求过程解析
Aug 20 Python
基于Python实现拆分和合并GIF动态图
Oct 22 Python
Python爬虫爬取煎蛋网图片代码实例
Dec 16 Python
Python多线程操作之互斥锁、递归锁、信号量、事件实例详解
Mar 24 Python
python中封包建立过程实例
Feb 18 Python
python Tkinter的简单入门教程
Apr 11 Python
python用tkinter开发的扫雷游戏
Jun 01 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解决抢购秒杀抽奖等大流量并发入库导致的库存负数的问题
2014/06/19 PHP
php 使用array函数实现分页
2015/02/13 PHP
PHP+MYSQL实现读写分离简单实战
2017/03/13 PHP
PHP堆栈调试操作简单示例
2018/06/15 PHP
php实现通过stomp协议连接ActiveMQ操作示例
2020/02/23 PHP
addRule在firefox下的兼容写法
2006/11/30 Javascript
使用TextRange获取输入框中光标的位置的代码
2007/03/08 Javascript
JS Excel读取和写入操作(模板操作)实现代码
2010/04/11 Javascript
JavaSciprt中处理字符串之sup()方法的使用教程
2015/06/08 Javascript
jquery使整个div区域可以点击的方法
2015/06/24 Javascript
概述一个页面从输入URL到页面加载完的过程
2016/12/16 Javascript
JS中的BOM应用
2018/02/02 Javascript
使用JS判断移动端手机横竖屏状态
2018/07/30 Javascript
对vue事件的延迟执行实例讲解
2018/08/28 Javascript
解决vue语法会有延迟加载显现{{xxx}}的问题
2019/11/14 Javascript
JS如何把字符串转换成json
2020/02/21 Javascript
Python守护进程用法实例分析
2015/06/04 Python
Python 爬虫多线程详解及实例代码
2016/10/08 Python
利用Python脚本生成sitemap.xml的实现方法
2017/01/31 Python
浅谈python内置变量-reversed(seq)
2017/06/21 Python
python实现nao机器人身体躯干和腿部动作操作
2019/04/29 Python
Python 旋转打印各种矩形的方法
2019/07/09 Python
python实现AdaBoost算法的示例
2020/10/03 Python
Python pickle模块常用方法代码实例
2020/10/10 Python
HTML5新特性之用SVG绘制微信logo
2016/02/03 HTML / CSS
洛佩桑酒店官方网站:Lopesan Hotels
2019/04/15 全球购物
Why do we need Unit test
2013/01/03 面试题
应届生高等护理求职信
2013/10/12 职场文书
护士个人自我鉴定
2014/03/24 职场文书
党员干部承诺书
2014/03/25 职场文书
学校地质灾害防治方案
2014/06/10 职场文书
沙滩主题婚礼活动策划方案
2014/09/15 职场文书
农村党支部书记四风问题个人对照检查材料
2014/09/21 职场文书
2015年毕业生实习评语
2015/03/25 职场文书
《王者天下》第4季首话新剧照 4月9日正式开播
2022/04/07 日漫
解决vue自定义组件@click点击失效问题
2022/04/30 Vue.js