我将 iPython 用于一些相对繁重的数值任务,其中的子集或多或少是令人尴尬的并行。这些任务具有非常简单的依赖关系,但我正在努力找出实现它们的最佳方法。基本问题是前面计算的结果必须用在后面的计算中,我想把这些任务单独提交给引擎。
基本上我有
in0a = ....
in0b = ....
res1a = f1(in0a) ## expensive, would like to run on engine 0
res1b = f1(in0b) ## expensive, would like to run on engine 1
### and same for c, d, ... on engines 2, 3, ... (mod the number of engines)
res2a = f2(res1a) ### depends on res1a = f1(in0a) being computed
res2b = f2(res1b) ### depends on res1b = f1(in0b) being computed
我可以将事物重组为一些按顺序f_12()
调用的函数,f1
并将f2
两个输出作为元组返回(我希望主引擎能够访问所有结果)并异步提交它们,或者我可以使用并行映射f1
开,[in0a, in0b, ...]
但我强烈希望不进行这些重构中的任何一个。
所以我真正想知道的是如何使用view.apply_async()
,以便运行res2a=f2(res1a)
只会res1a=f1(in0a)
在运行后发生(对于 b、c、d、... 任务也是如此)。
基本上,我想使用阻塞apply_async
。使用负载平衡,它应该类似于
res1a = v.apply_async(f1, in0a)
res2a = v.apply_async(f2, res1a)
但是我如何使第二个明确地依赖于第一个呢?我需要一个with v.temp_flags(follow=res1a)
吗?但是那我需要res1a.get()
在通话中使用吗?这会阻止提交直到它返回吗?
或者,我将如何直接查看?如果我只是将所有“a”任务提交给同一个引擎,但使用,这会阻塞,甚至在返回之前v.apply_async(f2, res1a.get())
都不会提交。get()