“该死的新手”以及这个网站的蟒蛇,所以请耐心等待。 :)
我尝试在多个进程上运行一个函数。它应该在一个带有两个参数的子函数上运行,一个应该由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]
看,我是什么意思?从模块来看,它仍然不起作用。