I.P*_*ley 10 python parallel-processing ipython python-2.7
我开始尝试使用IPython并行工具并遇到问题.我启动我的python引擎:
ipcluster start -n 3
Run Code Online (Sandbox Code Playgroud)
然后以下代码运行正常:
from IPython.parallel import Client
def dop(x):
rc = Client()
dview = rc[:]
dview.block=True
dview.execute('a = 5')
dview['b'] = 10
ack = dview.apply(lambda x: a+b+x, x)
return ack
ack = dop(27)
print ack
Run Code Online (Sandbox Code Playgroud)
按原样返回[42,42,42].但如果我将代码分成不同的文件:dop.py:
from IPython.parallel import Client
def dop(x):
rc = Client()
dview = rc[:]
dview.block=True
dview.execute('a = 5')
dview['b'] = 10
print dview['a']
ack = dview.apply(lambda x: a+b+x, x)
return ack
Run Code Online (Sandbox Code Playgroud)
并尝试以下方法:
from dop import dop
ack = dop(27)
print ack
Run Code Online (Sandbox Code Playgroud)
我从每个引擎得到错误:
[0:apply]: NameError: global name 'a' is not defined
[1:apply]: NameError: global name 'a' is not defined
[2:apply]: NameError: global name 'a' is not defined
Run Code Online (Sandbox Code Playgroud)
我不明白...为什么我不能将该功能放在不同的文件中并导入它?
min*_*nrk 16
快速回答:与装饰你的功能@interactive从IPython.parallel.util[1]如果你希望它有机会获得发动机的全局命名空间:
from IPython.parallel.util import interactive f = interactive(lambda x: a+b+x) ack = dview.apply(f, x)
实际解释:
IPython用户命名空间本质上是模块__main__.这是代码运行的地方execute('a = 5').
如果以交互方式定义函数,其模块还是__main__:
lam = lambda x: a+b+x lam.__module__ '__main__'
当引擎反序列化一个函数时,它会在函数模块的相应全局命名空间中执行,因此__main__客户端中定义的函数也在__main__引擎上定义,因此可以访问a.
一旦将其放入文件并导入它,则不再附加函数__main__,而是模块dop:
from dop import dop dop.__module__ 'dop'
通常在该模块中定义的所有函数(包括lambdas)都将具有此值,因此当它们在Engine上解包时,它们的全局命名空间将是dop模块的名称空间,而不是 __main__,因此您的"a"不可访问.
出于这个原因,IPython提供了一个简单的@interactive装饰器,导致任何函数被解包,就像它被定义一样__main__,无论函数实际定义在何处.
有关差异的示例,请执行以下操作dop.py:
from IPython.parallel import Client
from IPython.parallel.util import interactive
a = 1
def dop(x):
rc = Client()
dview = rc[:]
dview['a'] = 5
f = lambda x: a+x
return dview.apply_sync(f, x)
def idop(x):
rc = Client()
dview = rc[:]
dview['a'] = 5
f = interactive(lambda x: a+x)
return dview.apply_sync(f, x)
现在,dop将使用dop模块中的idop"a" ,并使用引擎命名空间中的"a".两者之间的唯一区别是传递给apply的函数包含在@interactive:
from dop import dop, idop print dop(5) # 6 print idop(5) # 10
[1]:在IPython> = 0.13(即将发布的版本)中,@interactive也可以作为from IPython.parallel import interactive,它应该始终存在.
| 归档时间: |
|
| 查看次数: |
4083 次 |
| 最近记录: |