0

“该死的新手”以及这里的这个网站的python,所以请多多包涵。:)

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

以下是我的真实设置的简化示例,以说明我的意思。如果我从我的 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

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

#### 添加: ####

好的,我有点猜到第一个回复是什么意思,所以我完全从头开始启动内核,并直接在单元格#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]

明白了吗?从一个模块它仍然不起作用。

4

0 回答 0