Python 使用decorator时发生ipyparallel错误

Python 使用decorator时发生ipyparallel错误,python,ipython,ipython-parallel,jupyter-notebook,Python,Ipython,Ipython Parallel,Jupyter Notebook,我试图使用带有lru\u缓存的ipyparallel系统运行作业,但遇到问题 从终端: ipcluster start -n 2 在ipython笔记本中: from ipyparallel import Client clients = Client() def world(): return hello() + " World" def hello(): return "Hello" world() 'Hello World' 使用ipyparallel运行它需要:

我试图使用带有
lru\u缓存的ipyparallel系统运行作业,但遇到问题

从终端:

ipcluster start -n 2
在ipython笔记本中:

from ipyparallel import Client
clients = Client()

def world():
    return hello() + " World"

def hello():
    return "Hello"

world()
'Hello World'
使用ipyparallel运行它需要:

clients[:].push(dict(hello=hello))
如果没有上一行,以下操作将失败,这并非意外,但如果运行,则可以正常工作:

clients[:].apply_sync(world)
['Hello World', 'Hello World']
这一切都如预期的那样工作,但是,对于
lru\u缓存
并行步骤会产生错误

from ipyparallel import Client
from functools import lru_cache

clients = Client()

def world():
    return hello() + " World"

@lru_cache(maxsize=2048)
def hello():
    return "Hello"

clients[:].push(dict(hello=hello))
clients[:].apply_sync(world)
此操作失败,出现以下错误:

  [0:apply]: 
---------------------------------------------------------------------------NameError                                 
Traceback (most recent call last)<string> in <module>()
<ipython-input-17-9ac5ef032485> in world()
NameError: name 'hello' is not defined

[1:apply]: 
---------------------------------------------------------------------------NameError                                 
Traceback (most recent call last)<string> in <module>()
<ipython-input-17-9ac5ef032485> in world()
NameError: name 'hello' is not defined
[0:应用]:
---------------------------------------------------------------------------名称错误
回溯()
在世界上
NameError:未定义名称“hello”
[1:应用]:
---------------------------------------------------------------------------名称错误
回溯()
在世界上
NameError:未定义名称“hello”
我意识到这可能是
lru\u cache
使用闭包时的名称空间问题,但是我希望有一个解决方法,以便我能够使用它。或者如果有人告诉我这根本不可能,那也会很有用,谢谢

我正在使用:
ipykernel(4.1.1)
ipyparallel(4.1.0)
ipython(4.0.1)

Python(3.5.1)

我很确定它与装饰器本身有关。如果用任何其他装饰函数替换
lru\u cache
,则会出现相同的错误。我不知道它是否能被解决。谢谢,@imaluengo这也是我最初的想法,尽管我能和其他装饰师一起工作。我在最初的文章中讨论了是否包含一个具有工作装饰器的示例,尽管这篇文章越来越长。Ops,我在python 2.7中尝试了一个测试装饰器,但它对我不起作用:/