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.j呼び出しでの使用を避けdoSomething、ローカルj変数のみを使用するようにコードにいくつかの改善を加えました。

コメントで述べたように、ではpp、あなたはあなたの仕事の結果だけを伝えます。そのため、この変数を返す必要あります。この変数はコールバックに渡されます。

于 2013-02-10T19:57:06.323 に答える