pool.map() を使用して、Lock() オブジェクトを含む複数のパラメーターを持つ関数をターゲットにしようとすると、サブプロセス間でのロックの共有の問題に対処するために重要です。従来の multiprocessing.Lock() は、pickle の制限のため、Pool メソッドに直接渡すことはできません。
1 つのアプローチは、Manager() を利用することです。そして Manager.Lock() をインスタンス化します。この方法は信頼性がありますが、Manager サーバーをホストする追加のプロセスによりオーバーヘッドが増加します。さらに、ロック操作には IPC 経由でこのサーバーと通信する必要があります。
代わりに、次を使用してプールの初期化中に通常の 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 サイトの他の関連記事を参照してください。