ipyparallel 附加到列表的并行 for 循环

ipyparallel Parallel for loop that appends to list

我有一个循环,它执行大量 CPU 密集计算并将结果附加到列表中,每次迭代。

我怎样才能让它并行工作。 C#上有并发容器,在ipyparallel中如何工作?

来自 ipyparallel 文档:

Python’s builtin map() functions allows a function to be applied to a sequence element-by-element. This type of code is typically trivial to parallelize.

http://ipyparallel.readthedocs.io/en/latest/direct.html#parallel-map

因此,使用 map 函数使其 运行 并行是一个问题,但如何将结果附加到列表中?这里有并发容器吗?

所以,我现在拥有的是这样的:

results = []
for element in list:
    outcome = very_heavy_computation_function(element)
    results.append(outcome)

如何并行执行此操作?

您可以通过以下方式实现。

函数foo表示循环中的计算,parameters表示要迭代的数据(如果有的话)。尽管 foo 休眠了 10 秒,但整个循环只需要 10 秒而不是 40 秒,因为我的环境中有 4 个引擎,并且 运行 在引擎上并行运行。 LoadBalancedView 提供动态负载平衡以在引擎之间平均分配工作。

from ipyparallel import Client

rc = Client()
view = rc.load_balanced_view()

def foo(param):
    import time
    time.sleep(10)
    return param*2

parameters = list(range(4))
async_results = []
for p in parameters:
    async_result = view.apply_async(foo, p)
    async_results.append(async_result)

rc.wait_interactive(async_results)

results = [ar.get() for ar in async_results]
print(results)

输出:

   4/4 tasks finished after   10 s
done
[0, 2, 4, 6]