8

IPython は初めてで、IPython 並列クラスター関数の実行中に中間結果を stdout に出力したいと考えています。(複数のプロセスでは、これにより出力が台無しになる可能性があることは承知していますが、それは問題ありません-テスト/デバッグのためだけであり、実行するプロセスは十分に長いため、そのような衝突はほとんどありません。) IPython のドキュメントを参照してください。ただし、並列化された関数が出力される例が見つかりません。基本的に、サブプロセスの印刷出力をメインの stdout にリダイレクトする方法を探しています。

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

プロセス内での印刷が機能しません:

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 ステートメントは出力されません。私は何を間違っていますか?「印刷」を機能させるにはどうすればよいですか?

4

1 に答える 1

9

実際にsubprocess.Popen( ... , stdout=PIPE)は、あなたが期待しているように見えるよりも似ています。Popenサブプロセスの stdout を確認するために読み取ることができる属性がオブジェクトにあるのと同様に、stdoutAsyncResult にはstdout、エンジンからキャプチャされた stdout を含む属性があります。リスト内の各項目が文字列としての単一エンジンの stdout である、文字列のリストでAsyncResult.stdoutあるという点で異なります。

だから、始めるために:

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()

与える

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

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

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

非同期結果の stdout を確認できます。

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

これは次を印刷します:

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

そして、これがすべてを示したノートブックです。

あなたの質問に基づいて、注意すべき点がいくつかあります。

  1. 出力の準備が整う前に、AsyncResult が終了するのを待つ必要があります ( async.get())
  2. display_outputs()何も返さない - 実際には印刷/表示自体をprint(async.display_outputs())行うため、意味がありません。
于 2013-03-08T19:54:56.197 に答える