マルチプロセスで共有辞書へのアクセスを同期する方法
マルチプロセス環境では、複数のプロセスが共有データへのアクセスを必要とする場合があります。辞書。ただし、適切な同期メカニズムが実装されていない場合、競合状態が発生し、信頼性の低いデータや破損したデータが発生する可能性があります。
共有キュー Q で作業中に、複数の子プロセスがグローバル ディクショナリ D にアクセスするシナリオを考えてみましょう。最初は、辞書には、子プロセスによって変更された結果が格納されているようです。ただし、メインプロセスが Q に参加すると、ディクショナリ D は空になります。
この問題は、マルチプロセスの非同期の性質に起因します。各子プロセスには独自のメモリ空間があり、共有変数に加えられた変更は、適切に同期しないと他のプロセスにすぐに表示されない可能性があります。
同期のためのマネージャー オブジェクトの使用
マルチプロセッシングで共有データへのアクセスを同期する一般的な解決策は、Manager を使用することです。 物体。 Manager は、参加しているすべてのプロセスがアクセスできる共有メモリ セグメントを提供します。
Manager を使用して同期を実装する方法は次のとおりです。
from multiprocessing import Process, Manager def f(d): d[1] += '1' d['2'] += 2 if __name__ == '__main__': manager = Manager() d = manager.dict() d[1] = '1' d['2'] = 2 p1 = Process(target=f, args=(d,)) p2 = Process(target=f, args=(d,)) p1.start() p2.start() p1.join() p2.join() print(d)
この例では、Manager オブジェクトは共有メモリ セグメントを作成します。辞書 d。両方の子プロセスからアクセスできます。子プロセスが辞書を変更すると、その変更は他のプロセスにすぐに表示されます。
出力:
$ python mul.py {1: '111', '2': 6}
この出力は、共有辞書が正常に作成されたことを示しています。子プロセスによって同期および更新されます。
以上がマルチプロセスで辞書を共有するときに競合状態を回避するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。