「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > マルチプロセスで辞書を共有するときに競合状態を回避するにはどうすればよいですか?

マルチプロセスで辞書を共有するときに競合状態を回避するにはどうすればよいですか?

2024 年 12 月 21 日に公開
ブラウズ:861

How to Avoid Race Conditions When Sharing Dictionaries in Multiprocessing?

マルチプロセスで共有辞書へのアクセスを同期する方法

マルチプロセス環境では、複数のプロセスが共有データにアクセスする必要がある場合があります。辞書。ただし、適切な同期メカニズムが実装されていない場合、競合状態が発生し、信頼性の低いデータや破損したデータが発生する可能性があります。

共有キュー Q で作業中に、複数の子プロセスがグローバル ディクショナリ D にアクセスするシナリオを考えてみましょう。最初は、辞書には、子プロセスによって変更された結果が格納されているようです。ただし、メイン プロセスが Q に参加すると、ディクショナリ D は空になります。

この問題は、マルチプロセスの非同期の性質に起因します。各子プロセスには独自のメモリ空間があり、共有変数に加えられた変更は、適切に同期しないと他のプロセスにすぐに表示されない場合があります。

同期のためのマネージャー オブジェクトの使用

マルチプロセスで共有データへのアクセスを同期するための一般的な解決策は、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 を作成します。子プロセスが辞書を変更すると、その変更は他のプロセスにすぐに表示されます。

Output:

$ python mul.py
{1: '111', '2': 6}

この出力は、共有辞書が子プロセスによって正常に同期され、更新されたことを示しています。

最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3