IPython并行编程依赖项

2024-04-26 13:33:07 发布

您现在位置:Python中文网/ 问答频道 /正文

其中一些比较尴尬的是,我在一些比较重或者比较少的并行任务上使用ipyth。这些任务具有非常简单的依赖关系,但我正在努力找出实现它们的最佳方法。基本问题是,前面的计算结果必须用于下面的计算,我想将这些任务分别提交给引擎。你知道吗

基本上我有

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,并以元组的形式返回两个输出(我希望主引擎能够访问所有结果),然后异步提交这些结果,或者我可以在[in0a, in0b, ...]上使用一个f1的并行映射,但我强烈希望不要进行这些重构。你知道吗

所以我真正想知道的是如何使用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()返回之前,甚至不会得到提交的。你知道吗


Tags: 引擎getasynconlikef2f1apply