IPython并行编程依赖项

时间:2014-04-25 10:08:40

标签: python ipython ipython-parallel

我正在使用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()函数,这些函数按顺序调用f1f2,并将两个输出作为元组返回(我喜欢主引擎有访问所有结果)并且只是异步提交,或者我可以在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()返回。

0 个答案:

没有答案