3

Pythonのマルチプロセッシングライブラリを使用して、複数のプロセスでモンテカルロシミュレーションを行っています。プロセスは基本的に何らかのオブジェクトを推測し、それが何らかの条件を満たした場合、共有リストに追加されます。このリストが何らかの条件を満たしていれば、私の計算は終了です。

私の現在のコードは次のようになります: (重要でない詳細のない疑似コード)

mgr = Manager()
ns = mgr.Namespace()
ns.mylist = []
ns.othersharedstuff = x
killsig = mgr.Event()
processes = [ MyProcess(ns, killsig) for _ in range(8) ]
for p in processes: p.start()
for p in processes: p.join()
get data from ns.mylist()

def MyProcess.run(self):
    localdata = y
    while not killsig.is_set():
        x = guessObject()
        if x.meetsCondition():
            add x to ns.mylist and put local data into ns()
            if ns.mylist meets condition:
                killsig.set()
    put local data into ns()

「while not killsig.is_set():」を「while True:」に置き換えると、シミュレーションの速度が約 25% 向上します。(もちろん、もう終了しないことを除いて)

シグナルを使用するよりも速い方法はありますか? 各プロセスの同期されていないローカル データが失われるかどうかは重要ではないため、process.terminate() を含むものでも問題ありません。

4

1 に答える 1

3

すべてのサブプロセスのリストを持つ元のプロセスを取得したので、それを使用してプロセスを終了してみませんか? 私はこのようなものを描いています:

ns.othersharedstuff = x
killsig = mgr.Event()
processes = [ MyProcess(ns, killsig) for _ in range(8) ]
for p in processes: p.start()
while not killsig.isSet():
    time.sleep(0.01) # 10 milliseconds 
for p in processes: p.terminate()
get data from ns.mylist()

次に、whileループを次のように設定できますwhile true:

于 2012-04-17T20:46:22.327 に答える