我正在使用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()
返回。