Python 使用ipcluster从从属节点读取标准输出

Python 使用ipcluster从从属节点读取标准输出,python,parallel-processing,ipython,pyzmq,Python,Parallel Processing,Ipython,Pyzmq,我已经使用 ipcluster start --n=8 然后使用 from IPython.parallel import Client c=Client() dview=c[:] e=[i for i in c] 我正在从节点(e[0]-e[7])上运行进程,这需要很多时间,我希望它们向主节点发送进度报告,以便我可以关注它们的进度 我认为有两种方法可以做到这一点,但到目前为止,尽管我花了数小时的时间在问题页面上搜寻,但我都无法实现这两种方法 或者我希望节点在没有提示的情况下将一些数据推回到

我已经使用

ipcluster start --n=8
然后使用

from IPython.parallel import Client
c=Client()
dview=c[:]
e=[i for i in c]
我正在从节点(e[0]-e[7])上运行进程,这需要很多时间,我希望它们向主节点发送进度报告,以便我可以关注它们的进度

我认为有两种方法可以做到这一点,但到目前为止,尽管我花了数小时的时间在问题页面上搜寻,但我都无法实现这两种方法

或者我希望节点在没有提示的情况下将一些数据推回到主节点。i、 e.在节点上运行的长流程中,我实现了一个函数,该函数定期将其进度传递给主节点

或者我可以将节点的stdout重定向到主节点的stdout,然后使用print跟踪进度。这就是我到目前为止一直在做的事情。每个节点都有自己的标准输出,所以打印在远程运行时不会执行任何操作。我已尝试将sys.stdout推送到节点,但这只是将其关闭


我不敢相信我是唯一一个想这么做的人,所以也许我错过了一些非常简单的事情。如何使用ipython跟踪远程发生的长进程?

在结果完成之前,stdout已经被捕获、记录和跟踪,并在到达客户端时到达客户端

IPython附带了监视所有引擎的stdout/err的脚本,可以很容易地调整为只监视此信息的一个子集,等等

在客户端本身中,可以在结果完成之前检查元数据dict中的stdout/err(
Client.metadata[msg_id].stdout
)。使用
Client.spin()
清除zeromq套接字中的任何传入消息,以确保此数据是最新的


如果希望stdout经常更新,请确保调用
sys.stdout.flush()
,以确保流在该点实际发布,而不是依赖隐式刷新,隐式刷新可能在工作完成之前不会发生。

谢谢,这正是我想要的。