对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实现Const详解
Jan 27 Python
python smtplib模块发送SSL/TLS安全邮件实例
Apr 08 Python
Python统计日志中每个IP出现次数的方法
Jul 06 Python
将Python代码打包为jar软件的简单方法
Aug 04 Python
python 网络编程常用代码段
Aug 28 Python
解决python文件字符串转列表时遇到空行的问题
Jul 09 Python
numpy自动生成数组详解
Dec 15 Python
Python中的二维数组实例(list与numpy.array)
Apr 13 Python
Django rest framework工具包简单用法示例
Jul 20 Python
python 删除字符串中连续多个空格并保留一个的方法
Dec 22 Python
python使用numpy实现直方图反向投影示例
Jan 17 Python
Python中的min及返回最小值索引的操作
May 10 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和Shell写Hadoop的MapReduce程序
2014/04/15 PHP
php自定义时间转换函数示例
2016/12/07 PHP
Laravel 手动开关 Eloquent 修改器的操作方法
2019/12/30 PHP
javaScript中的this示例学习详解及工作原理
2014/01/13 Javascript
jQuery DOM操作实例
2014/03/05 Javascript
JS、jquery实现几分钟前、几小时前、几天前等时间差显示效果的代码实例分享
2014/04/11 Javascript
node.js中的fs.realpath方法使用说明
2014/12/16 Javascript
JavaScript学习笔记之JS对象
2015/01/22 Javascript
Javascript函数的参数
2015/07/16 Javascript
javascript实现粘贴qq截图功能(clipboardData)
2016/05/29 Javascript
Vue中自定义全局组件的实现方法
2017/12/08 Javascript
Nodejs连接mysql并实现增、删、改、查操作的方法详解
2018/01/04 NodeJs
vue模仿网易云音乐的单页面应用
2019/04/24 Javascript
在Vue项目中使用Typescript的实现
2019/12/19 Javascript
Vue项目移动端滚动穿透问题的实现
2020/05/19 Javascript
布同 Python中文问题解决方法(总结了多位前人经验,初学者必看)
2011/03/13 Python
python模拟新浪微博登陆功能(新浪微博爬虫)
2013/12/24 Python
Python3 获取一大段文本之间两个关键字之间的内容方法
2018/10/11 Python
python3中eval函数用法使用简介
2019/08/02 Python
Tensorflow 模型转换 .pb convert to .lite实例
2020/02/12 Python
python脚本实现mp4中的音频提取并保存在原目录
2020/02/27 Python
Python如何存储数据到json文件
2020/03/09 Python
Python3爬虫里关于代理的设置总结
2020/07/30 Python
css3的@media属性实现页面响应式布局示例代码
2014/02/10 HTML / CSS
一款html5 canvas实现的图片玻璃碎片特效
2014/09/11 HTML / CSS
早晨薰衣草在线女性精品店:Morning Lavender
2021/01/04 全球购物
财务工作者先进事迹材料
2014/01/17 职场文书
吨的认识教学反思
2014/04/27 职场文书
优秀毕业生求职信
2014/06/05 职场文书
本科生求职信
2014/06/17 职场文书
安全生产奖惩制度
2015/08/06 职场文书
2019年浪漫婚礼证婚词
2019/06/27 职场文书
职业规划从高考志愿专业选择开始
2019/08/08 职场文书
Pytest allure 命令行参数的使用
2021/04/18 Python
教你用eclipse连接mysql数据库
2021/04/22 MySQL
SQL Server中的逻辑函数介绍
2022/05/25 SQL Server