0

我有以下多处理代码

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+ 分钟,最后一个进程在大部分时间单独运行。如果将工作负载重新划分为已完成的进程,这样会更快,以便始终使用所有内核。

有没有办法做到这一点?

4

2 回答 2

1

工作负载的划分方式可以通过chunksizemap_async的参数来控制。

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

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

于 2013-10-29T13:04:05.723 回答
0

您可以尝试.imap_unordered使用不同的chunksize值。更多在这里

于 2013-10-29T10:55:18.243 回答