1

parallelpythonを使用して、古いシリアルコードを並列に変換しようとしています。これは、オブジェクトの変数を変更するメソッドを持つオブジェクトに大きく依存しています。単純化のために構文を省略した簡略化された例:

class Network:
    self.adjacency_matrix = [ ... ]
    self.state = [ ... ]
    self.equilibria = [ ... ]

...

   def populate_equilibria(self):
       # this function takes every possible value that self.state can be in
       # runs the boolean dynamical system 
       # and writes an integer within self.equilibria for each self.state
       # doesn't return anything

私はこのメソッドを次のように呼び出します。コード:

j1 = jobserver.submit(net2.populate_equilibria,(),(),("numpy as num"))

仕事は要約されており、長い計算が行われることを知っているので、コードが実行されていると推測します。

問題は、parallelpythonを初めて使用する場合、メソッドが呼び出されると、それに応じて変数net2.equilibriaが記述され、改訂されたオブジェクト(net2)が取得されることを期待していました。これが私のコードの仕組みであり、オブジェクトの変数に作用するメソッドを持つ独立したオブジェクトです。

むしろ、計算は明白であり、適度なタイミングですが、変数net2.equilibriaは変更されません。PPが関数とオブジェクトのみを受け取り、他の場所で計算し、オブジェクトを返すことはないかのように、古いものが残ります。

何が恋しいですか?

前もって感謝します。

4

1 に答える 1

1

ParallelPythonはこのようには機能しません。関数をジョブサーバーに送信すると、計算結果を取得するために呼び出すことができるハンドルを取得します。これが、計算結果を取得する唯一の方法です。ローカルオブジェクトは、離れた並行プロセスによって変更されません。

あなたがすべきことは、オブジェクトの新しい状態を返す関数内にメソッド呼び出しをラップすることです。

def populate_equilibria (obj):
    obj.populate_equilibria()
    return obj

j1 = jobserver.submit(populate_equilibria,(net2,),(),("numpy as num"))
net2 = j1()
于 2012-03-30T11:27:20.340 に答える