私はprogressbarモジュールに非常に満足しています。私はStdOutリダイレクト機能で多くのことを使用しています。最近、私は(pathos)マルチプロセッシングを使い始めましたが、2つを組み合わせて動作させることはできません。Pythonはマルチプロセスを使ってstdout(progressbar)をリダイレクトします
また、キーボードの割り込みにいくつか問題がありましたが、これはa bug in Python2が原因であることが判明しました。私はこの問題に関連する場合に対処するために使用するコードを追加しました。
さらに、さまざまな地図機能を使って遊ぶことが多くの問題を解決できることに気付きました。私はimap
を使用しています。中間結果をcsvファイルに書き出し、もちろんプログレスバーを表示したいからです。
私はStdOutで自分自身を演奏し、インターネット上でいくつかの提案を試みました。しかし、私はいつも2つの望ましくない状況に終わる。
次のいずれかの
- STDOUTがリダイレクトされません取得し、プログレスバーは、各print文の後に繰り返されます。
- StdOutはリダイレクトされますが、ワーカーの出力は表示されません。
ここでは私の問題を実証するいくつかのおもちゃのコードです:
import time, signal, multiprocessing
import progressbar
def do_work(number):
if not number % 500:
print 'Special log occasion ...'
time.sleep(0.1)
def example(redirect_stdout):
workers = multiprocessing.cpu_count()
num_tasks = 1000
pbar = progressbar.ProgressBar(widgets=[progressbar.Bar()], max_value=num_tasks, redirect_stdout=redirect_stdout)
pbar.start()
# Start a with SIGINT turned of, so that workers can be interrupted
original_sigint_handler = signal.signal(signal.SIGINT, signal.SIG_IGN)
pool = multiprocessing.Pool(processes=workers)
signal.signal(signal.SIGINT, original_sigint_handler)
for i, _ in enumerate(pool.imap(do_work, xrange(num_tasks)), 1):
pbar.update(i)
pool.close()
pool.join()
pbar.finish()
print "Case1: Progressbar without redirecting output:"
example(False)
print "\nCase1: Progressbar without redirecting output:"
example(True)
出力:
Case1: Progresspar without redirecing output:
Special log occasion ...
|###################### |
Special log occasion ...
|#############################################|
Case2: Progresspar with redirecing output:
|#############################################|