对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实现partial改变方法默认参数
Aug 18 Python
Python简单连接MongoDB数据库的方法
Mar 15 Python
window下eclipse安装python插件教程
Apr 24 Python
一个月入门Python爬虫学习,轻松爬取大规模数据
Jan 03 Python
Python callable()函数用法实例分析
Mar 17 Python
Python向excel中写入数据的方法
May 05 Python
Django框架模板的使用方法示例
May 25 Python
DJANGO-URL反向解析REVERSE实例讲解
Oct 25 Python
Python 列表的清空方式
Jan 13 Python
Pytorch环境搭建与基本语法
Jun 03 Python
基于python计算滚动方差(标准差)talib和pd.rolling函数差异详解
Jun 08 Python
Python实现自动签到脚本的示例代码
Aug 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
yii2.0整合阿里云oss删除单个文件的方法
2017/09/19 PHP
php 实现银联商务H5支付的示例代码
2019/10/12 PHP
jQuery的实现原理的模拟代码 -5 Ajax
2010/08/07 Javascript
Jquery获取元素的父容器对象示例代码
2014/02/10 Javascript
JavaScript中双叹号(!!)作用示例介绍
2014/04/10 Javascript
jquery手风琴特效插件
2015/02/04 Javascript
xtemplate node.js 的使用方法实例解析
2016/08/22 Javascript
分享JS代码实现鼠标放在输入框上输入框和图片同时更换样式
2016/09/01 Javascript
详解angular2.x创建项目入门指令
2018/10/11 Javascript
jQuery实现经典的网页3D轮播图封装功能【附源码下载】
2019/02/15 jQuery
用原生 JS 实现 innerHTML 功能实例详解
2019/04/03 Javascript
浅谈layui 绑定form submit提交表单的注意事项
2019/10/25 Javascript
vue.js this.$router.push获取不到params参数问题
2020/03/03 Javascript
Python编程中的文件操作攻略
2015/10/16 Python
Android分包MultiDex策略详解
2017/10/30 Python
Pycharm 创建 Django admin 用户名和密码的实例
2018/05/30 Python
python3解析库BeautifulSoup4的安装配置与基本用法
2018/06/26 Python
对Python 内建函数和保留字详解
2018/10/15 Python
Python中logging实例讲解
2019/01/17 Python
python实现静态服务器
2019/09/05 Python
python+OpenCV实现车牌号码识别
2019/11/08 Python
基于python操作ES实例详解
2019/11/16 Python
python实现word文档批量转成自定义格式的excel文档的思路及实例代码
2020/02/21 Python
Python3爬虫关于识别检验滑动验证码的实例
2020/07/30 Python
英国鞋网:Rubber Sole
2020/03/03 全球购物
简述Linux文件系统通过i节点把文件的逻辑结构和物理结构转换的工作过程
2016/01/06 面试题
办公室保洁员岗位职责
2013/12/02 职场文书
教师学习培训邀请函
2014/02/04 职场文书
食品业务员岗位职责
2014/03/18 职场文书
学期评语大全
2014/04/30 职场文书
七一建党日演讲稿
2014/09/05 职场文书
2014年国庆节演讲稿
2014/09/19 职场文书
个人工作决心书
2015/09/22 职场文书
nginx网站服务如何配置防盗链(推荐)
2021/03/31 Servers
python3 sqlite3限制条件查询的操作
2021/04/07 Python
Android自定义ScrollView实现阻尼回弹
2022/04/01 Java/Android