0

我很震惊地发现互联网上关于并行 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

为了您的方便,我添加了评论。我在这里做错了什么?

4

1 回答 1

1

你应该使用callbacks

Acallbacks是您传递给submit调用的函数。该函数将以作业的结果作为参数调用(查看 API 以了解更多奥术用法)。

在你的情况下

设置回调:

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))

你完成了。

我对代码进行了一些改进,以避免self.jdoSomething调用中使用,并且只使用局部j变量。

如评论中所述,在 中pp,您仅传达工作的结果。这就是为什么你必须返回这个变量,它将被传递给回调。

于 2013-02-10T19:57:06.323 回答