にアクセスする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
属性アクセスが行うことと同じです。