我有以下多处理代码
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分钟,最后一个工艺在很长一段时间内单独运行。如果将工作负载重新划分为已完成的进程,则会更快,以便始终使用所有核心。
有没有办法实现这个目标?
答案 0 :(得分:1)
可以使用map_async的chunksize
参数控制工作负载的划分方式。
通过省略它,您当前使用的默认行为大致为chunksize = num_tasks / (num_processes * 4)
,因此平均每个进程只会收到4个块。
您可以首先将块大小设置为1以验证它是否正确分配工作负载,然后逐渐增加它,直到您看到性能改进为止。
答案 1 :(得分:0)
您可以尝试使用不同的.imap_unordered
值来试验chunksize
。
更多here。