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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。