我已经阅读了几个小时关于globals = globals()如何在Parallel Python上工作,我仍然有点困惑,也许你可以帮助我......我正在写一个基本上可以概括的代码为:
import pp
class Foo(object):
def __init__(self):
self.h = 2
def f():
foo = Foo()
return foo.h
ppservers = ()
job_server = pp.Server(ppservers=ppservers)
#print globals()
g = job_server.submit(f, (), globals = globals())
r = g()
输出是"全球名称' Foo'没有定义",正如我之前遇到的其他一些...我知道globals参数用于以简化的方式将函数和类传递给服务器,所以我希望它已经通过了Foo() class,因为它在执行job_server.submit指令之前在全局变量中(正如您通过取消注释print globals()指令所看到的那样)。
我对PP应该知道什么?有没有办法让这些代码在没有太多变化的情况下运行?
感谢您的阅读,我希望你们中的一些人能够了解这一点!
(注意:我不想在并行化作业之外创建Foo实例,只是因为初始化实例会触发整个程序,这是在 init (self)函数中。坏主意,我知道......)
答案 0 :(得分:0)
这是一个围绕能够pp
跟踪并正确关联代码依赖关系的问题。 pp
检查传入submit
的第一个对象(即f
),并提取源代码......然后将其传递给其他进程。它还传递globals
中传递的任何其他对象。但是,pp
主要跟踪函数,类和模块 - 它与实例和许多其他对象有关。
如果您使用名为pp
的{{1}}分叉(导入为ppft
),它应该按预期工作。 pp
使用更好的代码检查包(来自ppft
的{{1}}),从更广泛的python对象和更复杂的依赖项中提取源代码。
dill.source
在此处获取dill
:https://github.com/uqfoundation
它也>>> import pp
>>> class Foo(object):
... def __init__(self):
... self.h = 2
...
>>> def f():
... foo = Foo()
... return foo.h
...
>>> ppservers = ()
>>> job_server = pp.Server(ppservers=ppservers)
>>> g = job_server.submit(f, (), globals=globals())
>>> r = g()
>>> r
2
可安装。