将局部变量传递给ipyparallel集群的最佳方法

Dat*_*ede 4 ipython-notebook ipython-parallel

我在ipython笔记本中运行模拟,该笔记本由七个相互依赖的函数组成,需要13个不同的参数.在其他函数中调用某些函数以允许一个函数运行整个模拟.模拟涉及操纵两个参数,总共> 20k次迭代.两个模拟可以异步运行.由于每次迭代需要大约1.5秒,我正在研究并行处理.

当我第一次尝试ipyparallel时,我得到了一个未定义的全局名称错误.从某种意义上讲,无法找到本地对象的工人.为了避免花费相当多的时间去挖掘兔子洞,将一大堆物品传递给所有工人的最简单方法是什么?以这种方式使用ipyparallel时还有其他需要考虑的问题吗?

min*_*nrk 8

这个相关问题还有一些细节,但要点是:交互式定义的模块在交互式命名空间(__main__)中解析,这在引擎和客户端上是不同的.您可以将功能发送到引擎view.push(dict(func=func, func2=func2)),在这种情况下可以找到它们.另一种方法是在您确保安装在所有引擎上的模块或包中定义您的功能.

例如,在脚本中:

def bar(x):
    return x * x

def foo(y):
    return bar(y)

view.apply(foo, 5) # NameError on bar
view.push(dict(bar=bar)) # send bar
view.apply(foo, 5) # 25
Run Code Online (Sandbox Code Playgroud)

通常,当从笔记本或更大的脚本使用IPython并行时,其中一个早期步骤就是为引擎的命名空间提供种子:

rc[:].push(dict(
    f1=f1,
    f2=f2,
    const=const,
))
Run Code Online (Sandbox Code Playgroud)

如果您有多个名称以这种方式推送,可能是时候考虑在模块中定义这些函数,并分发它.

  • 我也有类似的情况。如果我不想传递函数,而是想推送对象的实例怎么办?如何访问引擎中的对象及其方法? (2认同)