我使用多处理编写了一个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()
答案 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()
也就是说,在等待其中任何一个工作之前,你可以按照你想要的那样开始工作。