1. ホーム
  2. python

[解決済み] Pythonのマルチプロセッシングプールimap_unorderedの呼び出しの進捗を表示しますか?

2022-07-10 23:34:09

質問

マルチプロセッシングの Pool セットタスクに成功したスクリプトがある。 imap_unordered() を呼び出します。

p = multiprocessing.Pool()
rs = p.imap_unordered(do_work, xrange(num_tasks))
p.close() # No more work
p.join() # Wait for completion

しかし、私の num_tasks は25万程度なので join() はメインスレッドを10秒ほどロックするので、メインプロセスがロックされていないことを示すために、コマンドラインにインクリメンタルにエコーアウトできるようにしたいのです。何かこんな感じ。

p = multiprocessing.Pool()
rs = p.imap_unordered(do_work, xrange(num_tasks))
p.close() # No more work
while (True):
  remaining = rs.tasks_remaining() # How many of the map call haven't been done yet?
  if (remaining == 0): break # Jump out of while loop
  print("Waiting for", remaining, "tasks to complete...")
  time.sleep(2)

結果オブジェクトやプール自体に、残りのタスク数を示すメソッドはないのでしょうか?私は multiprocessing.Value オブジェクトをカウンタとして使ってみました ( do_work を呼び出します。 counter.value += 1 アクションを呼び出します) が、カウンターは全体の値の85%までしか上がらず、インクリメントが停止します。

どのように解決するのですか?

結果セットのプライベート属性にアクセスする必要はありません。

from __future__ import division
import sys

for i, _ in enumerate(p.imap_unordered(do_work, xrange(num_tasks)), 1):
    sys.stderr.write('\rdone {0:%}'.format(i/num_tasks))