python 多进程并行编程 ProcessPoolExecutor的实现
使用ProcessPoolExecutor
fromconcurrent.futuresimportProcessPoolExecutor,as_completed importrandom
斐波那契数列
当n大于30时抛出异常
deffib(n): ifn>30: raiseException('cannot>30,now%s'%n) ifn<=2: return1 returnfib(n-1)+fib(n-2)
准备数组
nums=[random.randint(0,33)for_inrange(0,10)] ''' [13,17,0,22,19,33,7,12,8,16] '''
方案一:submit
submit输出结果按照子进程执行结束的先后顺序,不可控
withProcessPoolExecutor(max_workers=3)asexecutor: futures={executor.submit(fib,n):nforninnums} forfinas_completed(futures): try: print('fib(%s)resultis%s.'%(futures[f],f.result())) exceptExceptionase: print(e) ''' fib(13)resultis233. fib(17)resultis1597. fib(0)resultis1. fib(22)resultis17711. fib(19)resultis4181. cannot>30,now33 fib(7)resultis13. fib(12)resultis144. fib(8)resultis21. fib(16)resultis987. '''
等价写法:
withProcessPoolExecutor(max_workers=3)asexecutor: futures={} forninnums: job=executor.submit(fib,n) futures[job]=n forjobinas_completed(futures): try: re=job.result() n=futures[job] print('fib(%s)resultis%s.'%(n,re)) exceptExceptionase: print(e) ''' fib(13)resultis233. fib(17)resultis1597. fib(0)resultis1. fib(22)resultis17711. cannot>30,now33 fib(7)resultis13. fib(19)resultis4181. fib(8)resultis21. fib(12)resultis144. fib(16)resultis987. '''
方案二:map
map输出结果按照输入数组的顺序
缺点:某一子进程异常会导致整体中断
withProcessPoolExecutor(max_workers=3)asexecutor: try: results=executor.map(fib,nums) fornum,resultinzip(nums,results): print('fib(%s)resultis%s.'%(num,result)) exceptExceptionase: print(e) ''' fib(13)resultis233. fib(17)resultis1597. fib(0)resultis1. fib(22)resultis17711. fib(19)resultis4181. cannot>30,now33 '''
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。