我有一个可以并行运行的函数,但是,当我尝试运行它时,似乎正在串行调用该函数。
import multiprocessing as mp
def function_to_be_parallelized(x,y,z):
#compute_array takes 1-5 minutes computation to depending on x,y,z
computed_array=compute_array(x,y,z)
print ("running with parameters"+str(x*y*z))
return computed_array
def run(xs,ys,zs):
pool = mp.Pool(processes=4)
all_outputs = [pool.apply(function_to_be_parallelized, args=(x,y,z)) for x in xs for y in ys for z in zs]
我发现打印语句一次打印一个,每个语句仅在上一个过程完成后打印,我在具有 4 个内核的机器上运行它。
这是因为内部函数中的进程各自占用 2 个以上的内核(因此无法并行化(吗?还是有其他原因?
pool.apply
等待结果准备就绪,因此在上一个作业完成之前,您不会提交新作业。你必须使用类似apply_async
或map
的东西,但即便如此,也不能保证你会看到交错或乱序执行,并行化的好处可能会被这样的函数的开销所淹没。
这对我来说看起来不错。这可能是等待打印缓冲区填充的问题。查看apply_async:https://docs.python.org/2/library/multiprocessing.html#multiprocessing.pool.multiprocessing.Pool.apply_async
也 正在调用 print 命令,python 不会将您的print
发送到 stdout,除非那里有足够的东西。尝试在function_to_be_parallellized
中添加sys.stdout.flush()
以尽快强制打印。