ホームページ > バックエンド開発 > Python チュートリアル > Python マルチプロセッシング アプリケーションでプロセス間でロックを共有する方法

Python マルチプロセッシング アプリケーションでプロセス間でロックを共有する方法

Barbara Streisand
リリース: 2024-10-17 10:52:02
オリジナル
770 人が閲覧しました

How to Share Locks Between Processes in Python Multiprocessing Applications

Python を使用したプロセス間でのロックの共有

マルチスレッド アプリケーションでは、ロックは共有リソースへのアクセスを同期するために重要です。ただし、これらのプロセスが複数の子プロセスに分散されている場合、それらの間でロックを共有することが困難になる可能性があります。

問題:

multiprocessing.Lock を利用する関数を考えてみましょう。 () オブジェクト (l) は、重要なリソースへのアクセスを管理します。ワーカー プロセスのプール (pool) とロックを引数として渡す部分関数 (func) を作成した後、pool.map() を使用してタスクを複数のプロセスに分散しようとすると、実行時エラーが発生します。「オブジェクトをロックする」継承を通じてプロセス間でのみ共有する必要があります。

要素が欠落しています:

デフォルトでは、Python が通常の multiprocessing.Lock() インスタンスを安全にピクルできないためにエラーが発生します。

解決策:

この制限を克服し、プロセス間でロックを正常に共有するには、2 つの実行可能なアプローチが存在します:

  1. Manager オブジェクトの使用:

    • multiprocessing.Manager() インスタンス (m) を作成し、安全なデータ共有を可能にする Manager.Lock() を渡します。
    • このメソッドでは、外部マネージャー プロセスと IPC が必要なため、追加のオーバーヘッドが発生します。
  2. プール作成時のロックの受け渡し:

    • 初期化子 kwarg を使用して、プールの初期化時に通常の multiprocessing.Lock() (l) を渡します。
    • これにより、ロック インスタンスがすべての子プロセス内でグローバルにアクセスできるようになります。部分関数の必要性を排除します。

コード例 (2 番目の解決策を使用):

<code class="python">from multiprocessing import Pool, Lock

def init(l):
    global lock
    lock = l

def target(iterable_item):
    # Access shared resources using lock

def main():
    l = Lock()
    pool = Pool(initializer=init, initargs=(l,))
    pool.map(target, iterable)
    pool.close()
    pool.join()</code>
ログイン後にコピー

次の方法によってを使用すると、プロセス間でロックを効果的に共有でき、分散 Python アプリケーションでの同期とデータ共有が可能になります。

以上がPython マルチプロセッシング アプリケーションでプロセス間でロックを共有する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート