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

时间:2018-02-23 00:38:41

标签: python jupyter ipython-parallel

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

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

来自ipyparallel文档:

  

Python的内置map()函数允许将函数逐个元素地应用于序列。这种类型的代码通常很容易并行化。

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

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

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

c

我该如何并行完成?

1 个答案:

答案 0 :(得分:2)

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

函数foo表示循环中的计算,parameters表示要迭代的数据(如果有)。即使foo睡眠10s,整个循环也只需要10s而不是40s,因为我的环境中有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]