使用并行python和类

使用并行python和类,python,oop,parallel-python,Python,Oop,Parallel Python,我震惊地发现,在互联网上,关于并行python(PP)和处理类的教程和指南是如此之少。我遇到了一个问题,我想初始化同一类的两个实例,然后检索一些变量(例如并行读取5个数据文件的实例,然后检索它们的数据)。下面是一段简单的代码来说明我的问题: import pp class TestClass: def __init__(self, i): self.i = i def doSomething(self): print "\nI'm being

我震惊地发现,在互联网上,关于并行python(PP)和处理类的教程和指南是如此之少。我遇到了一个问题,我想初始化同一类的两个实例,然后检索一些变量(例如并行读取5个数据文件的实例,然后检索它们的数据)。下面是一段简单的代码来说明我的问题:

import pp

class TestClass:
    def __init__(self, i):
        self.i = i

    def doSomething(self):
        print "\nI'm being executed!, i = "+str(self.i)
        self.j = 2*self.i
        print "self.j is supposed to be "+str(self.j)
        return self.i

class parallelClass:
    def __init__(self):
        job_server = pp.Server()
        job_list = []
        self.instances = [] # for storage of the class objects
        for i in xrange(3):
            TC = TestClass(i) # initiate a new instance of the TestClass
            self.instances.append(TC) # store the instance
            job_list.append(job_server.submit(TC.doSomething, (), ())) # add some jobs to the job_list
        results = [job() for job in job_list] # execute order 66...

        print "\nIf all went well there's a nice bunch of objects in here:"
        print self.instances
        print "\nAccessing an object's i works ok, but accessing j does not"
        print "i = "+str(self.instances[2].i)
        print "j = "+str(self.instances[2].j)

if __name__ == '__main__' :
    parallelClass() # initiate the program
为了您的方便,我添加了一些评论。我在这里做错了什么?

您应该使用
回调
callbacks
是传递给
submit
调用的函数。将以作业的结果作为参数()调用该函数

就你而言 设置回调:

class TestClass:
    def doSomething(self):
         j = 2 * self.i
         return j # It's REQUIRED that you return j here.

    def set_j(self, j):
        self.j = j
将回调添加到作业提交调用

 class parallellClass:
      def __init__(self):
          #your code...
          job_list.append(job_server.submit(TC.doSomething, callback=TC.set_j))
你完成了

我对代码做了一些改进,以避免在
doSomething
调用中使用
self.j
,而只使用本地
j
变量


如评论中所述,在
pp
中,您仅传达工作结果。这就是为什么要返回此变量,它将被传递到回调函数

怎么了?您的程序的预期输出是什么?您将得到什么?顺便问一下:当您实际需要像
main
函数这样的函数时,为什么要使用类
\uuuu init\uuu
。我从来没有想过创建一个类的实例会阻止我的整个程序。@Bakuriu我希望程序打印一个实例的
j
值。我得到一个
AttributeError:TestClass实例没有属性“j”
。不要担心
\uuuu init\uuuu
,这段代码只是我实际程序的简化表示。我相信问题在于代码是在不同的对象上执行的。parallelpythonsimple pickle对象并将它们发送到子流程,因此您可以修改对象的本地状态,这不会影响原始实例。您可以检查此项,将
self
id
打印到
doSomething
中,以及
instances
@Bakuriu中元素的
id
,您完全正确,实例不匹配。您知道如何避免/修复此问题吗?并行python不提供对象之间的自动同步,这意味着您只能通过函数的结果进行通信。
doSomething
的结果应提供您所需的所有信息。