设为首页 收藏本站
查看: 3207|回复: 0

[经验分享] python multiprocessing.Pool

[复制链接]

尚未签到

发表于 2015-4-27 05:22:37 | 显示全部楼层 |阅读模式
示例1:



import multiprocessing
def run(msg):
print '%s, it works!' % msg
def start_process():
print 'Starting',multiprocessing.current_process().name
if __name__=='__main__':
pool = multiprocessing.Pool(processes=2, initializer=start_process,)
pool.apply_async(run('congbo'))
pool.close()
pool.join()
  运行结果:


  Starting PoolWorker-1
Starting PoolWorker-2
congbo, it works!
  pool.apply_async(run('congbo')) 这种使用方式也行?见示例2。
  

示例2:



import multiprocessing
def run(msg):
print '%s, it works!' % msg
while True:
pass

def start_process():
print 'Starting',multiprocessing.current_process().name
if __name__=='__main__':
pool = multiprocessing.Pool(processes=2, initializer=start_process,)
pool.apply_async(run('congbo'))
   print "It's my turn!"
pool.close()
pool.join()
  运行结果:



Starting PoolWorker-1
Starting PoolWorker-2
congbo, it works!
...
...
  没有打印出“It's my turn!”,程序没有切换到主进程接着执行,子进程死循环。
  说明这种使用方式是不对的,只能像 apply_async 原型那样使用。见示例3。
  

示例3:



import multiprocessing
def run(msg):
print '%s, it works!' % msg
def start_process():
print 'Starting',multiprocessing.current_process().name
if __name__=='__main__':
pool = multiprocessing.Pool(processes=2, initializer=start_process,)
pool.apply_async(run, args=('congbo',))
pool.close()
pool.join()
  运行结果:


  Starting PoolWorker-1
Starting PoolWorker-2
congbo, it works!
  tips:apply_async 中 args 应为元组,故单个参数后面需加逗号。如果参数错误,不成功执行,不报异常!
  

示例4:



import multiprocessing
class Worker:
def run(self, msg):
print '%s, it works!' % msg
def start_process():
print 'Starting',multiprocessing.current_process().name
if __name__=='__main__':
pool = multiprocessing.Pool(processes=2, initializer=start_process,)
pool.apply_async(Worker().run, args=('congbo',))
pool.close()
pool.join()
  运行结果:



Starting PoolWorker-1
Starting PoolWorker-2
Exception in thread Thread-2:
Traceback (most recent call last):
File "/usr/lib/python2.7/threading.py", line 551, in __bootstrap_inner
self.run()
File "/usr/lib/python2.7/threading.py", line 504, in run
self.__target(*self.__args, **self.__kwargs)
File "/usr/lib/python2.7/multiprocessing/pool.py", line 319, in _handle_tasks
put(task)
PicklingError: Can't pickle : attribute lookup __builtin__.instancemethod failed
  

示例5:



import multiprocessing
class Worker:
def run(self, msg):
print '%s, it works!' % msg
def wrap(worker, msg):
worker.run(msg)
def start_process():
print 'Starting',multiprocessing.current_process().name
if __name__=='__main__':
pool = multiprocessing.Pool(processes=2, initializer=start_process,)
    pool.apply_async(wrap, args=(Worker(), 'congbo'))
pool.close()
pool.join()
  不直接传入类实例的方法,用另一个函数包装一下,将类的实例作为参数传入即可。
  为什么要这样?有没有更好的办法?
  
  参考:http://stackoverflow.com/questions/1816958/cant-pickle-type-instancemethod-when-using-pythons-multiprocessing-pool-ma
  
  原文:http://www.iyunv.com/congbo/archive/2012/08/23/2652322.html

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-60880-1-1.html 上篇帖子: 翻译:《用python和Qt进行GUI编程》——第四章 下篇帖子: PYTHON学习总结
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表