我的多个流程能否得到更好的监管,以便在(几乎)同时完成?

时间:2013-10-29 09:25:14

标签: python multiprocessing

我有以下多处理代码

from multiprocessing import Pool
pool = Pool(maxtasksperchild=20)
likelihoods = pool.map_async(do_comparison, itertools.combinations(clusters, 2)).get()
condensed_score_matrix = [1 / float(l) if l != 0 and l < 5 else 10 for l in likelihoods]
spectra_names = [c.get_names()[0] for c in clusters]
pool.close()

此代码的问题在于不同的进程无法同时完成。我正在使用八个进程。在第一个工艺完成和最后一个工艺完成之间可以有20-30分钟,最后一个工艺在很长一段时间内单独运行。如果将工作负载重新划分为已完成的进程,则会更快,以便始终使用所有核心。

有没有办法实现这个目标?

2 个答案:

答案 0 :(得分:1)

可以使用map_async的chunksize参数控制工作负载的划分方式。

通过省略它,您当前使用的默认行为大致为chunksize = num_tasks / (num_processes * 4),因此平均每个进程只会收到4个块。

您可以首先将块大小设置为1以验证它是否正确分配工作负载,然后逐渐增加它,直到您看到性能改进为止。

答案 1 :(得分:0)

您可以尝试使用不同的.imap_unordered值来试验chunksize。 更多here