从模块内部推送多个进程的参数?

时间:2015-02-28 10:06:18

标签: python ipython-parallel

“该死的新手”以及这个网站的蟒蛇,所以请耐心等待。 :)

我尝试在多个进程上运行一个函数。它应该在一个带有两个参数的子函数上运行,一个应该由map_sync从一个范围传递,另一个应该是静态,所以我尝试直接传递它通过“推送”。

以下是我真实设置的简化示例,用于说明我的意思。如果我从我的iPython Notebook运行它,它运行得很完美:

In [26]:

from IPython.parallel import Client

def mul(b):
    return a*b

def mmul(a,b):
    lvClient = Client()
    v = lvClient[:]
    v.push(dict(a=a))
    return v.map_sync(mmul, range(b))

In [27]: mmul(2,5)

Out[27]: [0, 2, 4, 6, 8]

现在,当我尝试从上面获取整个代码并将其放入名为“mymultitest.py”的模块(完全不变)时,它不再起作用了:

In [24]: import mymultitest

Out[24]: <module 'mymultitest' from 'mymultitest.pyc'>

In [25]: mt = mymultitest.mmul(2,5)

[0:apply]: 
-------------------------------------------------------------------------
NameError     Traceback (most recent call last)<string> in <module>()
E:\iPython\mymultitest.pyc in mmul(b)
      4 
      5 def mul(b):
----> 6     return a*b
      7 
      8 def mmul(a,b):
NameError: global name 'a' is not defined

我犯了什么错误 - 解决方案是什么?

#### ADD:####

好的,我猜测第一个回复是什么意思,所以我从头开始完全启动内核并直接在单元格#1中输入代码,以避免“a”已被定义为变量。同样的结果,完美地运作:

In [1]:
from IPython.parallel import Client

def mul(b):
    return a*b

def mmul(x,y):
    lvClient = Client()
    v = lvClient[:]
    v.push(dict(a=x))
    return v.map_sync(mul, range(y))

In [2]: mmul(2,10)

Out[2]: [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

看,我是什么意思?从模块来看,它仍然不起作用。

0 个答案:

没有答案