IPython并联发动机的实时输出?

IPython并联发动机的实时输出?,ipython,ipython-parallel,Ipython,Ipython Parallel,我正在使用IPython的强大功能运行一系列长期运行的任务 如何从IPython客户端的ipengines标准输出中获得实时输出 例如,我正在运行dview.map\u async(有趣,很多参数)和fun打印到标准输出。我希望看到他们正在发生的产出 我知道AsyncResult.stdout,但它只有在所有任务完成后才可用。您可以通过访问AsyncResult.stdout同时查看stdout,它将返回字符串列表,这些字符串是每个引擎的stdout 最简单的情况是: print ar.stdo

我正在使用IPython的强大功能运行一系列长期运行的任务

如何从IPython客户端的ipengines标准输出中获得实时输出

例如,我正在运行
dview.map\u async(有趣,很多参数)
fun
打印到标准输出。我希望看到他们正在发生的产出


我知道
AsyncResult.stdout
,但它只有在所有任务完成后才可用。

您可以通过访问
AsyncResult.stdout
同时查看stdout,它将返回字符串列表,这些字符串是每个引擎的stdout

最简单的情况是:

print ar.stdout
您可以将其封装在一个简单的函数中,在等待AsyncResult完成时打印标准输出:

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
属性访问所做的基本相同。

以防有人仍在挣扎 获取单个内核的普通打印输出:

我修改了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
...

太棒了,非常感谢!我真的很感谢你在IPython parallel上所做的工作以及你在这个答案上所付出的努力。干得好!不过,笔记本可能需要更新,因为
any(stdouts)
引发了一个异常:-/属性
ar.\u目标
ar.stdout
描述在哪里?