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

时间:2016-05-01 01:14:19

标签: 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.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()

但是,如果我使用Process而不是Pool,我会按预期得到正确的结果:

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()

1 个答案:

答案 0 :(得分:4)

想想你在这里做了什么:

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()

也就是说,在等待其中任何一个工作之前,你可以按照你想要的那样开始工作。