ホームページ  >  記事  >  バックエンド開発  >  Python のマルチプロセッシング モジュールのワーカー プロセス間でキューを安全に共有するにはどうすればよいですか?

Python のマルチプロセッシング モジュールのワーカー プロセス間でキューを安全に共有するにはどうすればよいですか?

DDD
DDDオリジナル
2024-10-19 18:47:02785ブラウズ

How to Share a Queue Safely Between Worker Processes in Python's Multiprocessing Module?

複数のワーカー プロセス間でキューを共有する

マルチプロセッシング モジュールは、タスクを同時に実行するための複数のプロセスを作成および管理するメカニズムを提供します。一般的な使用例の 1 つは、ワーカー プロセスに結果を中央プロセスに報告させることです。ここでキューが登場します。ただし、apply_async を使用してワーカー プロセスを生成する場合、ワーカー プロセス間でキューを共有するのは困難な場合があります。

エラー: オブジェクトを継承のみにキューに入れる

キューを apply_async に直接設定すると、「キュー オブジェクトは継承を通じてプロセス間でのみ共有される必要があります。」という RuntimeError が発生する可能性があります。このエラーは、キュー インスタンスが継承によって直接関連付けられているプロセス間でのみ共有できることを示します。提供されたコードでは、ワーカー プロセスがメイン プロセスから継承されていないため、エラーが発生します。

解決策: multiprocessing.Manager を使用する

この継承制限を克服するには、次のようにします。 multiprocessing は Manager クラスを提供します。 Manager は、キューを含む複数のプロセス間で共有できるオブジェクトを作成する方法を提供します。 Manager を利用することで、継承を必要とせずにすべてのワーカー プロセスにアクセスできるキューを作成できます。

リファクタリングされたコード:

次のコードは、共有する方法を示しています。 multiprocessing.Manager を使用したワーカー プロセス間のキュー:

import multiprocessing
def worker(name, que):
    que.put("%d is done" % name)

if __name__ == '__main__':
    pool = multiprocessing.Pool(processes=3)
    m = multiprocessing.Manager()
    q = m.Queue()
    workers = pool.apply_async(worker, (33, q))

このコードでは、Manager() はマネージャー インスタンス m を作成し、これを使用して共有キュー q をインスタンス化します。キューは引数として apply_async メソッドに渡され、ワー​​カー プロセスがキューにアクセスして結果を書き込むことができるようになります。このアプローチにより、共有キューを介したワーカー プロセスとメイン プロセス間の通信が可能になり、継承エラーの可能性が排除されます。

以上がPython のマルチプロセッシング モジュールのワーカー プロセス間でキューを安全に共有するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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