8

私はIPythonを初めて使い、IPython並列クラスタ機能を実行している間に中間結果をstdoutに出力したいと考えています。 (私は、複数のプロセスがあると、これが出力を変える可能性があることに気付いていますが、それはテスト/デバッグのためのものであり、実行しているプロセスは十分長いので、そうした衝突は起こりそうもありません。 IPythonのドキュメントですが、並列化された関数が出力される例は見つかりません。 は基本的に、私はメインの標準出力、プロセス内の印刷が動作しませんIPython並列プロセスでstdoutに印刷

subprocess.Popen(... , stdout=...) 

のIPythonと同等にサブプロセスの印刷出力をリダイレクトする方法を探しています:

rc = Client() 
dview = rc() 
def ff(x): 
    print(x) 
    return x**2 
sync = dview.map_sync(ff,[1,2,3,4]) 
print('sync res=%s'%repr(sync)) 
async = dview.map_async(ff,[1,2,3,4]) 
print('async res=%s'%repr(async)) 
print(async.display_outputs()) 

sync res=[1, 4, 9, 16] 
async res=[1, 4, 9, 16] 

だから計算が正しく実行返しますが、関数FFでprint文は、すべてのプロセスがreturneていない場合でも、印刷されることはありませんd。 私は何が間違っていますか? 「プリント」を動作させるにはどうすればよいですか?

答えて

9

これは実際にはあなたが期待しているよりもsubprocess.Popen(... , stdout=PIPE)と似ています。 Popenオブジェクトにはstdout属性があり、サブプロセスのstdoutを読むために読むことができます。 AsyncResultには、エンジンから取得したstdoutを含むstdout属性が含まれています。 AsyncResult.stdoutはののリストです。リストの各項目は単一のエンジンのstdoutを文字列として表しています。アウトを開始するので、

、:私たちは、非同期結果の標準出力を見ることができます

print(async.stdout) 
['1\n2\n', '3\n4\n'] 

rc = parallel.Client() 
dview = rc[:] 
def ff(x): 
    print(x) 
    return x**2 
sync = dview.map_sync(ff,[1,2,3,4]) 
print('sync res=%r' % sync) 
async = dview.map_async(ff,[1,2,3,4]) 
print('async res=%r' % async) 
async.get() 

たちは、文字列のAsyncResult.stdoutリストを見ることができます

sync res=[1, 4, 9, 16] 
async res=<AsyncMapResult: ff> 

を与えます:

print('async output:') 
async.display_outputs() 

出力します。実証され、このすべてと

async output: 
[stdout:0] 
1 
2 
[stdout:1] 
3 
4 

here is a notebookを。あなたの質問をもとに

には、いくつかの注意事項、:

  1. 出力は
  2. display_outputs()async.get())準備ができている前に、AsyncResultが終了するのを待たなければならないが、何も返さない - それは実際にはありません印刷/表示するので、print(async.display_outputs())は意味をなさない。
+0

非常に有益な答えです。計算が行われている間に標準出力を見る方法はありますか? – spencerlyon2

+0

はい - printステートメントの場合、 'out as in asyncresult.stdout:print out'を実行します。これは、出力が部分的であっても、いつでも行うことができます。 – minrk

+1

ソースコードにアクセスすることなくこれを達成する方法はありますか?スレッドでログメッセージを出力するために私が使用しているライブラリがあり、実行時に印刷することができます。これを行うためにIPythonのクラスを拡張する必要がありますか? – hgcrpd

関連する問題