マルチプロセッシングを使用して Python のプロセス間でロックを共有する方法

Linda Hamilton
リリース: 2024-10-17 11:12:02
オリジナル
911 人が閲覧しました

How to Share a Lock Between Processes in Python Using Multiprocessing

Python のプロセス間でロックを共有する

pool.map() を使用して、Lock() オブジェクトを含む複数のパラメーターを持つ関数をターゲットにしようとすると、サブプロセス間でのロックの共有の問題に対処するために重要です。従来の multiprocessing.Lock() は、pickle の制限のため、Pool メソッドに直接渡すことはできません。

オプション 1: Manager と Manager.Lock() を使用する

1 つのアプローチは、Manager() を利用することです。そして Manager.Lock() をインスタンス化します。この方法は信頼性がありますが、Manager サーバーをホストする追加のプロセスによりオーバーヘッドが増加します。さらに、ロック操作には IPC 経由でこのサーバーと通信する必要があります。

オプション 2: イニシャライザーを使用してプール作成時にロックを渡す

代わりに、次を使用してプールの初期化中に通常の multiprocessing.Lock() を渡すこともできます。イニシャライザのキーワード引数。これにより、ロック インスタンスがすべての子ワーカーでグローバルになることが保証されます。この方法により、部分的な関数の必要性がなくなり、プロセスが合理化されます。

オプション 2 を使用した例を次に示します:

<code class="python">def target(iterable_item):
    for item in items:
        # Do cool stuff
        if (... some condition here ...):
            lock.acquire()
            # Write to stdout or logfile, etc.
            lock.release()

def init(l):
    global lock
    lock = l

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

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

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