「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > マルチプロセッシングを使用して Python のプロセス間でロックを共有する方法

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

2024 年 11 月 5 日に公開
ブラウズ:321

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 を使用した例を次に示します:

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()
リリースステートメント この記事は次の場所に転載されています: 1729132755 権利侵害がある場合は、[email protected] に連絡して削除してください。
最新のチュートリアル もっと>

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

Copyright© 2022 湘ICP备2022001581号-3