如何使用多处理池与列表?



我试图使以下代码并行:

当我调用带有标记图像的get_min_max_feret_from_labelim()函数时(例如:1000x1000数组,标签是数字,介于0和1100之间),它为每个标签调用get_min_max_feret_from_mask()函数。结果,get_min_max_feret_from_labelim()返回一个包含1101个元素的列表。工作得很好,但是在大图像和许多标签的情况下,它需要很多很多时间,所以我想使用multiprocessing Pool调用get_min_max_feret_from_mask()。

原始代码使用:

for label in labels:
results[label] = get_min_max_feret_from_mask(label_im == label)
return results

我想更换这部分。在将'ncores'添加到参数列表后,我尝试了这个:

with Pool(ncores) as p:
for label in labels:
results[label] = p.map(get_min_max_feret_from_mask, label_im == label)
return results

但它不起作用。我该如何解决这个问题?谢谢你。

Map期望一个参数列表并返回一个结果列表:

with Pool(ncores) as p:
result_list = p.map(get_min_max_feret_from_mask, [label_im == label for label in labels])

返回的列表将匹配参数列表的顺序,这意味着第一个结果是第一个标签的结果,依此类推。

另一个选择是使用apply_async来调度任务而不阻塞,这立即返回一个AsyncResult对象,允许您稍后检索结果。这个允许你保持原来的结构:

with Pool(ncores) as p:
for label in labels:
async_results[label] = p.apply_async(get_min_max_feret_from_mask, (label_im == label,))
results = {label: result.get() for label, result in async_results.items()}

你可以这样写:

with Pool(ncores) as p:
return p.map(get_min_max_feret_from_mask, labels)

Pool.map直接将可迭代对象(列表或元组等)作为第二个参数,不需要额外的循环:

https://docs.python.org/3/library/multiprocessing.html multiprocessing.pool.Pool.map

相关内容

  • 没有找到相关文章

最新更新