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

[经验分享] python多进程编程multiprocessing

[复制链接]

尚未签到

发表于 2015-4-27 13:11:53 | 显示全部楼层 |阅读模式
  
  python支持多线程多进程编程,标准库模块threading使得python的多线程编程变得容易,支持很多功能,在python2.6后,python新添加了多进程的标准库模块multiprocessing,功能非常类似threading。
  下面介绍multiprocessing模块的一些常用类和方法。
  1、multiprocessing.Process
  该类原型如下:
  class multiprocessing.Process(group=None, target=None, name=None, args=(), kwargs={})
  group参数通常为None,仅仅是为兼容threading.Thread。
  target为可调用对象,被run()函数调用,一般用法就是将函数传给该参数,交给子进程运行。
  name为进程名,如不指定,默认为Process-1,Process-2....这样的名字,数字随自己查数量依次递增。
  args为target调用的参数元祖。
  kwargs为target调用的关键字参数字典。
  Process类生成一个process对象,并运行在一个新的单独的进程内。
  一个简单的使用例子:



1 from multiprocessing import Process
2 import time
3
4 def timetask(times):
5     time.sleep(times)
6     print time.localtime()
7
8 if __name__ == '__main__':
9     arg = 5
10     p = Process(target = timetask, args = (arg,))
11     p.start()
12     p.join()
  每个process对象最多只能调用一次start()方法,join([timeout])方法会阻塞调用process对象的进程,直到timeout时间超时,或者process进程退出。如果timeout设置为None,则无超时时间。对于linux操作系统的进程管理,父进程会等待子进程退出,并收回子进程的资源,然后父进程再退出。如果父进程先于子进程退出,则子进程会被init进程接管。如果父进程没有退出也没有回收子进程资源,则子进程会一直停留在僵死状态。这里join方法就是阻塞父进程,等待子进程执行完毕。
  如果在子进程里面要接受标准输入(如调用raw_input函数),这时候会有问题。因为标准输入是被父进程占用,因此这里子进程无法从标准输入读取数据。
  一个解决办法是将标准输入描述符,传入子进程函数:



1 from multiprocessing import Process
2 import sys, os
3 import time
4
5 def intask(x, fileno):
6     sys.stdin = os.fdopen(fileno)
7     while True:
8         in_char = raw_input("Enter to continue, Q to quit: ")
9         if in_char.upper() == 'Q':
10             break
11         print x * x
12
13 if __name__ == '__main__':
14     fn = sys.stdin.fileno()
15     arg = 5
16     p = Process(target = intask, args = (arg, fn))
17     p.start()
18     p.join()
  开启多个进程并行执行:



1 from multiprocessing import Process
2 import sys, os
3 import time
4
5 def timetask(times):
6     time.sleep(times)
7     print time.localtime()
8
9
10 def works(func, arg, worknum):
11     proc_record = []
12     for i in range(worknum):
13         p = Process(target = func, args = (arg,))
14         p.start()
15         proc_record.append(p)
16     for p in proc_record:
17         p.join()
18
19     
20 if __name__ == '__main__':
21     arg = 5
22     procs = 4
23     works(timetask, arg, procs)
  程序同时开启4个进程并行执行timetask函数,这里需要注意的是先把所有的进程对象执行了start()方法后,再执行join(),如果对每个进程对象一起执行start()和join(),那么单个进程对象start()后,会马上阻塞父进程,导致无法马上对下一个进程对象执行start()。结果就是子进程并不是并行运行,而是依次运行。
  有时间再更新multiprocessing模块的其他类和方法

运维网声明 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-61258-1-1.html 上篇帖子: Python list、tuple、dict区别 下篇帖子: Python时间处理
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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