0

我已经阅读了几个小时关于 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() 类,因为它在执行 job_server.submit 指令之前位于全局变量中(正如您可以通过取消对 print globals() 指令的注释看到的那样)。

我应该知道的关于 PP 的什么遗漏?有没有办法让这段代码在没有太多更改的情况下运行?

感谢您阅读我,我希望你们中的一些人了解它是如何工作的!

(备注:我不想在并行化作业之外创建 Foo 的实例,仅仅是因为初始化一个实例会触发整个程序,它在init (self) 函数内......坏主意,我知道......)

4

1 回答 1

0

这是一个围绕着能够pp正确追踪和关联代码依赖关系的问题。pp检查传入submit(即f)的第一个对象,并提取源代码……然后将其传递给其他进程。它还传入传入的任何其他对象globals。但是,pp主要跟踪函数、类和模块——它在实例和许多其他对象方面存在问题。

如果您使用pp被调用的分支ppft(它导入为pp),它应该按预期工作。 ppft使用更好的代码检查包(dill.sourcefrom dill),从更广泛的 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)
>>> g = job_server.submit(f, (), globals=globals())
>>> r = g()
>>> r
2

ppft到这里:https : //github.com/uqfoundation

它也是可pip安装的。

于 2015-02-03T18:06:56.643 回答