ホームページ  >  記事  >  バックエンド開発  >  マルチプロセスで辞書を共有するときに競合状態を回避するにはどうすればよいですか?

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

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-26 12:20:09439ブラウズ

How to Avoid Race Conditions When Sharing Dictionaries in Multiprocessing?

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

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

共有キュー 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。