我的python多处理程序按顺序运行辅助程序
我已经编写了一个使用多处理的python程序。该程序调用一个8工作者,该工作者在睡眠3秒后输出一个随机数。我希望程序在3秒内完成,但它在24秒内完成,就好像每个辅助函数都是按顺序而不是并行计算的。有什么想法吗我的python多处理程序按顺序运行辅助程序,python,multiprocessing,Python,Multiprocessing,我已经编写了一个使用多处理的python程序。该程序调用一个8工作者,该工作者在睡眠3秒后输出一个随机数。我希望程序在3秒内完成,但它在24秒内完成,就好像每个辅助函数都是按顺序而不是并行计算的。有什么想法吗 import time import numpy as np import multiprocessing as mp import time import sys def f(i): np.random.seed(int(time.time()+i)) time.sl
import time
import numpy as np
import multiprocessing as mp
import time
import sys
def f(i):
np.random.seed(int(time.time()+i))
time.sleep(3)
res=np.random.rand()
print "From i = ",i, " res = ",res
if __name__=='__main__':
num_workers=mp.cpu_count() # My CPu has 8 cores.
pool=mp.Pool(num_workers)
for i in range(num_workers):
p=pool.apply_async(f, args=(i,))
p.get()
pool.close()
pool.join()
但是,如果我使用进程而不是池,我会得到预期的正确结果:
import time
import numpy as np
import multiprocessing as mp
import time
import sys
def f(i):
np.random.seed(int(time.time()+i))
time.sleep(3)
res=np.random.rand()
print "From i = ",i, " res = ",res
if res>0.7:
print "find it"
if __name__=='__main__':
num_workers=mp.cpu_count()
pool=mp.Pool(num_workers)
for i in range(num_workers):
p=mp.Process(target=f,args=(i,))
p.start()
想想你在这里做什么:
for i in range(num_workers):
p=pool.apply_async(f, args=(i,))
p.get()
每次通过循环,您都会向池进程发送一些工作,然后(通过.get()
)显式等待该进程返回其结果。当然,没有什么事情会同时发生
通常的做法是:
workers = [pool.apply_async(f, args=(i,)) for i in range(num_workers)]
for w in workers:
w.get()
也就是说,在等待任何一个工作人员之前,您可以启动任意数量的工作人员。您还可以使用
pool.map(f,range(num_workers))
,它为您收集结果。@Blckknght,当然-我假设OP的问题是对他们真正想做的事情的极大简化,apply_async()
在实际应用中比map()
更有意义。但是,当然,我不知道;-)4年后来到这里,你的评论挽救了我的生命@Timpeters对此表示感谢,他想知道为什么我的过程也是顺序/线性的,这就把事情弄清楚了!