pool.map() を使用して、Lock() オブジェクトを含む複数のパラメーターを持つ関数をターゲットにしようとすると、サブプロセス間でのロックの共有の問題に対処するために重要です。従来の multiprocessing.Lock() は、pickle の制限のため、Pool メソッドに直接渡すことはできません。
1 つのアプローチは、Manager() を利用することです。そして Manager.Lock() をインスタンス化します。この方法は信頼性がありますが、Manager サーバーをホストする追加のプロセスによりオーバーヘッドが増加します。さらに、ロック操作には IPC 経由でこのサーバーと通信する必要があります。
代わりに、次を使用してプールの初期化中に通常の 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()
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3