我的python多处理程序按顺序运行辅助程序

我的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

我已经编写了一个使用多处理的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.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对此表示感谢,他想知道为什么我的过程也是顺序/线性的,这就把事情弄清楚了!