全局,类和并行Python

时间:2014-11-16 17:46:53

标签: python class globals parallel-python

我已经阅读了几个小时关于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)函数中。坏主意,我知道......)

1 个答案:

答案 0 :(得分:0)

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

如果您使用名为pp的{​​{1}}分叉(导入为ppft),它应该按预期工作。 pp使用更好的代码检查包(来自ppft的{​​{1}}),从更广泛的python对象和更复杂的依赖项中提取源代码。

dill.source

在此处获取dillhttps://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 可安装。