0

我将 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()

4

0 回答 0