基于python的多进程共享变量正确打开方式


Posted in Python onApril 28, 2018

多进程共享变量和获得结果

由于工程需求,要使用多线程来跑一个程序。但是因为听说python的多线程是假的,于是使用多进程,反正任务需要共享的参数少。

查阅资料,发现实现多进程主要使用Multiprocessing,有两种方式,一种是Process,另一种是Pool。

p = Process(target=fun,args=(args))

再通过p.start()来启动一个子进程,通过p.join()方法来使得子进程运行结束后再执行父进程。

但是这样很烦,还要写个for 循环来开n个线程和join。

于是推荐用Pool。它可以开一个固定大小的进程池,然后每个线程执行apply_async()函数调用要执行的函数,最后再close和join。

代码如下:

pathm=Manager().Queue(len(pathlist))
for d in pathlist:
 pathm.put(d)
p=Pool(cp.threads)
results=[]
for i in range(cp.threads):
 temp=p.apply_async(ProcessWorker,args=(i,pathm,cp))
 results.append(temp)
print 'Waiting for all subprocesses done...'
p.close()
p.join()
print 'All subprocesses finish Processing.'
results=[r.get() for r in results]

上面的代码演示了如何使用pool多进程,如何在Pool里的进程之间共享变量pathm,以及如何获得进程函数执行的结果。需要注意的是,ProcessWorker必须是个无界的函数,否则报错该函数无法被pickle从而不能分配到各个进程。

cPickle.PicklingError: Can't pickle <type 'instancemethod'>: attribute lookup __builtin__.instancemethod failed

有界函数和python的多进程机制

从上面引申到了一个概念,就是有界函数无界函数的概念。

查阅资料之后我总结如下:

有界函数是包在一个类中,并且只有当类被实例化之后才能使用的函数,它的界就是这个实例。我们常常把这些函数称为类方法。例如以self为参数的类方法。

无界函数可以是没有被包在类中的函数,也可以是类中的静态方法,它们跟类是独立的。如类中的静态方法,它即使在某个类中被定义,但是不能访问类中的参数和其他方法。

python多进程的机制应该是把每个进程要调用的方法和传入的参数(如上面例子中的ProcessWorker)编译然后打包,然后复制到每个进程中执行。如果输入的是一个有界函数,那么它的参数应该是它所属的类(包括参数和方法),但是这是无法获得的,而且类属性和方法可能会有坑,导致难以打包。所以python限定了多进程要调用的函数不能是类方法。

我们要把多进程调用的函数放到类外面,或者变成静态函数。但是静态函数的话不能被所属的类的方法调用(self.ProcessWorker的形式),需要在外部调用,如mc=MyClass(),mc.ProcessWorker来调用,或者MyClass().ProcessWorker来调用。

以上这篇基于python的多进程共享变量正确打开方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python 测试实现方法
Dec 24 Python
Python使用django获取用户IP地址的方法
May 11 Python
基于Python_脚本CGI、特点、应用、开发环境(详解)
May 23 Python
python 连接sqlite及简单操作
Jun 30 Python
python并发2之使用asyncio处理并发
Dec 21 Python
matplotlib实现热成像图colorbar和极坐标图的方法
Dec 13 Python
对Python3使运行暂停的方法详解
Feb 18 Python
python爬虫解决验证码的思路及示例
Aug 01 Python
Python中if有多个条件处理方法
Feb 26 Python
pytorch fine-tune 预训练的模型操作
Jun 03 Python
Python爬取某拍短视频
Jun 11 Python
Python查找算法的实现 (线性、二分,分块、插值查找算法)
Apr 24 Python
基于Python log 的正确打开方式
Apr 28 #Python
python+pandas分析nginx日志的实例
Apr 28 #Python
详谈套接字中SO_REUSEPORT和SO_REUSEADDR的区别
Apr 28 #Python
python实现关键词提取的示例讲解
Apr 28 #Python
python实现扫描日志关键字的示例
Apr 28 #Python
python socket网络编程之粘包问题详解
Apr 28 #Python
在Windows中设置Python环境变量的实例讲解
Apr 28 #Python
You might like
php 购物车的例子
2009/05/04 PHP
Linux下创建nginx脚本-start、stop、reload…
2014/08/03 PHP
如何解决phpmyadmin导入数据库文件最大限制2048KB
2015/10/09 PHP
关于laravel-admin ueditor 集成并解决刷新的问题
2019/10/21 PHP
jquery 获取json数据实现代码
2009/04/27 Javascript
json2.js的初步学习与了解
2011/10/06 Javascript
JavaScript高级程序设计(第3版)学习笔记9 js函数(下)
2012/10/11 Javascript
详解JavaScript中void语句的使用
2015/06/04 Javascript
jQuery实现横向带缓冲的水平运动效果(附demo源码下载)
2016/01/29 Javascript
JQuery EasyUI的使用
2016/02/24 Javascript
关于JS中的apply,call,bind的深入解析
2016/04/05 Javascript
使用JQuery 加载页面时调用JS的实现方法
2016/05/30 Javascript
Bootstrap Scrollspy源码学习
2017/03/02 Javascript
angular.js指令中的controller、compile与link函数的不同之处
2017/05/10 Javascript
Node.js开发第三方微信公众平台
2017/06/05 Javascript
详解用Node.js写一个简单的命令行工具
2018/03/01 Javascript
解决element-ui中下拉菜单子选项click事件不触发的问题
2018/08/22 Javascript
详解React 服务端渲染方案完美的解决方案
2018/12/14 Javascript
谈谈IntersectionObserver懒加载的具体使用
2019/10/15 Javascript
JS+CSS实现随机点名(实例代码)
2019/11/04 Javascript
Vue 中 a标签上href无法跳转的解决方式
2019/11/12 Javascript
python命令行参数解析OptionParser类用法实例
2014/10/09 Python
Python入门_浅谈for循环、while循环
2017/05/16 Python
Python算法之求n个节点不同二叉树个数
2017/10/27 Python
对python中数据集划分函数StratifiedShuffleSplit的使用详解
2018/12/11 Python
nohup后台启动Python脚本,log不刷新的解决方法
2019/01/14 Python
Python序列类型的打包和解包实例
2019/12/21 Python
解决windows下python3使用multiprocessing.Pool出现的问题
2020/04/08 Python
详解HTML5 LocalStorage 本地存储
2016/12/23 HTML / CSS
HTML5 form标签之解放表单验证、增加文件上传、集成拖放的使用方法
2013/04/24 HTML / CSS
物业保安主管岗位职责
2013/12/25 职场文书
竞选大队长演讲稿
2014/04/29 职场文书
助残日活动总结
2014/08/27 职场文书
2014司机年终工作总结
2014/12/05 职场文书
初中差生评语
2014/12/29 职场文书
欢送领导祝酒词
2015/08/12 职场文书