其中一些比较尴尬的是,我在一些比较重或者比较少的并行任务上使用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()
函数,这些函数按顺序调用f1
和f2
,并以元组的形式返回两个输出(我希望主引擎能够访问所有结果),然后异步提交这些结果,或者我可以在[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()
返回之前,甚至不会得到提交的。你知道吗
目前没有回答
相关问题 更多 >
编程相关推荐