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() を含むものでも問題ありません。