对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 相关文章推荐
php使用递归与迭代实现快速排序示例
Jan 23 Python
Python中字典和JSON互转操作实例
Jan 19 Python
python在Windows下安装setuptools(easy_install工具)步骤详解
Jul 01 Python
python爬虫之BeautifulSoup 使用select方法详解
Oct 23 Python
python实现泊松图像融合
Jul 26 Python
python 实现在tkinter中动态显示label图片的方法
Jun 13 Python
django框架实现模板中获取request 的各种信息示例
Jul 01 Python
Python如何使用k-means方法将列表中相似的句子归类
Aug 08 Python
Python读取文件内容为字符串的方法(多种方法详解)
Mar 04 Python
Python flask框架实现浏览器点击自定义跳转页面
Jun 04 Python
Python手动或自动协程操作方法解析
Jun 22 Python
python处理json数据文件
Apr 11 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
对Session和Cookie的区分与解释
2007/03/16 PHP
PHP 获取远程网页内容的代码(fopen,curl已测)
2011/06/06 PHP
使用PHP生成PDF方法详解
2015/01/23 PHP
php实现的PDO异常处理操作分析
2018/12/27 PHP
PHP接入支付宝接口失效流程详解
2020/11/10 PHP
收集的网上用的ajax之chat.js文件
2007/04/08 Javascript
如何创建一个JavaScript弹出DIV窗口层的效果
2013/09/25 Javascript
jquery判断元素是否隐藏的多种方法
2014/05/06 Javascript
JavaScript中setUTCMilliseconds()方法的使用详解
2015/06/12 Javascript
基于MVC4+EasyUI的Web开发框架形成之旅之界面控件的使用
2015/12/16 Javascript
jQuery EasyUi实战教程之布局篇
2016/01/26 Javascript
JS实现回到页面顶部动画效果的简单实例
2016/05/24 Javascript
浅谈JS中的三种字符串连接方式及其性能比较
2016/09/02 Javascript
浅析BootStrap中Modal(模态框)使用心得
2016/12/24 Javascript
微信小程序 转发功能的实现
2017/08/04 Javascript
jquery 键盘事件的使用方法详解
2017/09/13 jQuery
浅谈基于Vue.js的移动组件库cube-ui
2017/12/20 Javascript
vue input标签通用指令校验的实现
2019/11/05 Javascript
vue使用一些外部插件及样式的配置代码
2019/11/18 Javascript
Vue.directive 实现元素scroll逻辑复用
2019/11/29 Javascript
基于p5.js 2D图像接口的扩展(交互实现)
2020/11/30 Javascript
python类定义的讲解
2013/11/01 Python
简化Python的Django框架代码的一些示例
2015/04/20 Python
Python中多个数组行合并及列合并的方法总结
2018/04/12 Python
pandas数据预处理之dataframe的groupby操作方法
2018/04/13 Python
python爬取指定微信公众号文章
2018/12/20 Python
Python实现寻找回文数字过程解析
2020/06/09 Python
美国电视购物HSN官网:HSN
2016/09/07 全球购物
伦敦一家领先的精品零售商:IRIS Fashion
2019/05/24 全球购物
卡骆驰英国官网:Crocs英国
2019/08/22 全球购物
学院书画协会部门职责
2013/11/28 职场文书
大学迎新晚会主持词
2014/03/24 职场文书
工作推荐信范文
2014/05/10 职场文书
餐饮店长岗位职责
2015/04/14 职场文书
Django drf请求模块源码解析
2021/06/08 Python
Pytest中skip skipif跳过用例详解
2021/06/30 Python