如何将IPython.parallel用于具有多个输入的函数?

时间:2014-10-28 05:59:33

标签: python multiprocessing ipython ipython-parallel

这是我第一次尝试使用IPython.parallel,所以请耐心等待。

我读了这个问题 Parfor for Python 并且无法实现如下的简单示例:

import gmpy2 as gm
import numpy as np
from IPython.parallel import Client

rc = Client()
lview = rc.load_balanced_view()
lview.block = True

a = 1
def L2(ii,jj):
    out = []
    out.append(gm.fac(ii+jj+a))
    return out 

Nloop = 100
ii = range(Nloop)
jj = range(Nloop)
R2 = lview.map(L2, zip(ii, jj))

我遇到的问题是:

  1. a是在循环之外定义的,我认为我需要做类似" push"但是我有点困惑。我是否需要"拉"后?
  2. 函数需要两个参数,我不知道如何正确传递它们。我尝试了zip(ii,jj)之类的内容,但遇到了一些错误。
  3. 另外,我假设我使用随机库gmpy2不应该影响事情。它是否正确?我需要为此做些什么特别的事吗?
  4. 理想情况下,我希望得到您的帮助,所以在这个简单的示例中,代码无错运行。

    如果你认为发布我在#2失败的尝试是有益的,请告诉我。我和#1在黑暗中。

1 个答案:

答案 0 :(得分:0)

我发现了两种方法可以使这项工作:

一个是push变量到核心。没有必要拉它。该变量将简单地定义在每个流程引擎的命名空间中。

rc.client[:].push({'a':a})
R2 = lview.map(L2, ii, jj)

另一种方法是重新定义L2a作为输入,并将a数组传递给map函数:< / p>

def L2(ii,jj,a):
    out = []
    out.append(gm.fac(ii+jj+a))
    return out
R2 = lview.map(L2, ii, jj, [a]*Nloop)

关于本网站的进口情况: http://ipython.org/ipython-doc/dev/parallel/parallel_multiengine.html#non-blocking-execution 您只需在函数中导入所需的库:

  

注意函数内部的导入。这是一个常见的模型,以确保   在运行任务的地方导入适当的模块。您   也可以通过手动将模块导入引擎名称空间   view.execute(&#39; import numpy&#39;)()。

或者您可以按照此链接进行操作 http://ipython.org/ipython-doc/dev/parallel/parallel_multiengine.html#remote-imports