imap_unordered()
呼び出しを使用してタスクのマルチプロセッシングプールセットを正常に実行するスクリプトがあります。
p = multiprocessing.Pool()rs = p.imap_unordered(do_work、xrange(num_tasks))p.close()#これ以上の作業はありませんp.join()#完了を待ちます
ただし、私の num_tasks
は約250,000なので、 join()
はメインスレッドを10秒ほどロックします。コマンドラインに段階的にエコーアウトして、メインプロセスを表示できるようにしたいと思います。ロックされていません。次のようなものです。
p = multiprocessing.Pool()rs = p.imap_unordered(do_work、xrange(num_tasks))p.close()#(True ):remaining = rs.tasks_remaining()#まだ行われていないマップ呼び出しはいくつありますか? if(remaining == 0):break#whileループから飛び出しますprint(" Waiting for"、remaining、" tasks to complete ...")time.sleep(2)
残りのタスクの数を示す結果オブジェクトまたはプール自体のメソッドはありますか? multiprocessing.Value
オブジェクトをカウンターとして使用してみました( do_work
はタスクの実行後にcounter.value+ = 1
アクションを呼び出します)が、カウンタは、インクリメントを停止する前に、合計値の最大85%にしか到達しません。