我有一个循环,它执行一系列CPU密集型计算,并在每次迭代时将结果附加到列表中。
我怎样才能让它并行工作。在C#上有并发容器,它在ipyparallel中是如何工作的?
来自ipyparallel文档:
Python的内置map()函数允许将函数逐个元素地应用于序列。这种类型的代码通常很容易并行化。
http://ipyparallel.readthedocs.io/en/latest/direct.html#parallel-map
因此,使用map函数让它并行运行是一个问题,但是如何将结果附加到列表中呢?这里有并发容器吗?
所以,我现在拥有的是这样的:
c
我该如何并行完成?
答案 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]