对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使用PyGreSQL操作PostgreSQL数据库教程
Jul 30 Python
Python中使用Tkinter模块创建GUI程序实例
Jan 14 Python
利用python求相邻数的方法示例
Aug 18 Python
基于Python实现的ID3决策树功能示例
Jan 02 Python
wx.CheckBox创建复选框控件并响应鼠标点击事件
Apr 25 Python
Python实现string字符串连接的方法总结【8种方式】
Jul 06 Python
python实现周期方波信号频谱图
Jul 21 Python
opencv python 基于KNN的手写体识别的实例
Aug 03 Python
Python二叉树的遍历操作示例【前序遍历,中序遍历,后序遍历,层序遍历】
Dec 24 Python
初次部署django+gunicorn+nginx的方法步骤
Sep 11 Python
基于TensorFlow常量、序列以及随机值生成实例
Jan 04 Python
解决jupyter notebook启动后没有token的坑
Apr 24 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 获取完整url地址
2008/12/20 PHP
TP - 比RBAC更好的权限认证方式(Auth类认证)
2021/03/09 PHP
fireworks菜单生成器mm_menu.js在 IE 7.0 显示问题的解决方法
2009/10/20 Javascript
IE之动态添加DOM节点触发window.resize事件
2010/07/27 Javascript
file模式访问网页时iframe高度自适应解决方案
2013/01/16 Javascript
简介JavaScript中的sub()方法的使用
2015/06/08 Javascript
JS实现双击编辑可修改状态的方法
2015/08/14 Javascript
Jquery实现的简单轮播效果【附实例】
2016/04/19 Javascript
js 自带的 map() 方法全面了解
2016/08/16 Javascript
JavaScript编写一个简易购物车功能
2016/09/17 Javascript
父组件中vuex方法更新state子组件不能及时更新并渲染的完美解决方法
2018/04/25 Javascript
Vue props用法详解(小结)
2018/07/03 Javascript
微信小程序实现的五星评价功能示例
2019/04/25 Javascript
原生js拖拽实现图形伸缩效果
2020/02/10 Javascript
VUE : vue-cli中去掉路由中的井号#操作
2020/09/04 Javascript
python实现TCP服务器端与客户端的方法详解
2015/04/30 Python
Numpy中转置transpose、T和swapaxes的实例讲解
2018/04/17 Python
使用tensorflow实现线性svm
2018/09/07 Python
详解python项目实战:模拟登陆CSDN
2019/04/04 Python
Opencv-Python图像透视变换cv2.warpPerspective的示例
2019/04/11 Python
python实现将文件夹内的每张图片批量分割成多张
2019/07/22 Python
pandas 空数据处理方法详解
2019/11/02 Python
python程序需要编译吗
2020/06/19 Python
css3 border-image使用说明
2010/06/23 HTML / CSS
Sandro Paris美国官网:典雅别致的法国时尚服饰品牌
2017/12/26 全球购物
法国隐形眼镜网站:VisionDirect.fr
2020/03/03 全球购物
我的applet原先好好的, 一放到web server就会有问题,为什么?
2016/05/10 面试题
毕业生的求职信范文分享
2013/12/04 职场文书
物流创业计划书
2014/02/01 职场文书
工程类专业自荐信范文
2014/03/09 职场文书
航海技术专业毕业生求职信
2014/04/06 职场文书
激励员工的口号
2014/06/16 职场文书
2014教师研修学习体会
2014/07/08 职场文书
2015年大学元旦晚会活动策划书
2014/12/09 职场文书
解决redis批量删除key值的问题
2022/03/23 Redis
windows server 2012安装FTP并配置被动模式指定开放端口
2022/06/10 Servers