2

IPython の優れた並列化機能を使用して、実行時間の長いタスクを多数実行しています。

IPython クライアントで ipengines の stdout からリアルタイム出力を取得するにはどうすればよいですか?

たとえば、私は実行dview.map_async(fun, lots_of_args)していfunて、stdout に出力しています。出来上がりの様子を見ていきたいと思います。

については知っていますが、すべてのタスクが完了した後にAsyncResult.display_output()のみ使用できます。

4

2 に答える 2

8

にアクセスするAsyncResult.stdoutと、各エンジンからの標準出力である文字列のリストが返されます。

最も単純なケースは次のとおりです。

print ar.stdout

AsyncResult が完了するのを待っている間に stdout を出力する単純な関数でこれをラップできます。

import sys
import time
from IPython.display import clear_output

def wait_watching_stdout(ar, dt=1, truncate=1000):
    while not ar.ready():
        stdouts = ar.stdout
        if not any(stdouts):
            continue
        # clear_output doesn't do much in terminal environments
        clear_output()
        print '-' * 30
        print "%.3fs elapsed" % ar.elapsed
        print ""
        for eid, stdout in zip(ar._targets, ar.stdout):
            if stdout:
                print "[ stdout %2i ]\n%s" % (eid, stdout[-truncate:])
        sys.stdout.flush()
        time.sleep(dt)

この関数を説明するノートブックの例

現在、古い IPython を使用している場合は、stdout 属性への人為的なアクセス制限が表示されることがあります (「結果が準備できていません」エラー)。情報はメタデータで利用できるため、タスクが完了していない間でも情報を取得できます。

rc.spin()
stdout = [ rc.metadata[msg_id]['stdout'] for msg_id in ar.msg_ids ]

これは本質的に、ar.stdout属性アクセスが行うことと同じです。

于 2013-08-07T05:13:46.170 に答える
0

個々のカーネルの通常の印刷出力を取得するのにまだ苦労している場合に備えて:

プログラムの実行中に各カーネルの stdout が変更されるかどうかを常にチェックすることにより、各カーネルの出力がローカルのものであるかのように得られるように、minrk の回答を調整しました。

asdf = dview.map_async(function, arguments)

# initialize a stdout0 array for comparison
stdout0 = asdf.stdout

while not asdf.ready():
    # check if stdout changed for any kernel
    if asdf.stdout != stdout0:
        for i in range(0,len(asdf.stdout)):
            if asdf.stdout[i] != stdout0[i]:
                # print only new stdout's without previous message and remove '\n' at the end
                print('kernel ' + str(i) + ': ' + asdf.stdout[i][len(stdout0[i]):-1])

                # set stdout0 to last output for new comparison
                stdout0 =  asdf.stdout
    else:
        continue


asdf.get()

出力は次のようになります。

kernel0: message 1 from kernel 0
kernel1: message 1 from kernel 1
kernel0: message 2 from kernel 0
kernel0: message 3 from kernel 0
kernel1: message 2 from kernel 0
...
于 2016-12-05T13:35:44.527 に答える