使用ipcluster从slave节点读取stdout

时间:2012-03-22 13:46:07

标签: 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])需要花费很多时间,我希望他们向主人发送进度报告,这样我就可以关注如何远远超过他们。

我可以通过两种方式来做到这一点,但到目前为止,我无法实现其中任何一种方法,尽管数小时在问题页面中进行拖网。

我希望节点在没有提示的情况下将一些数据推送回主节点。即在节点上运行的长进程内,我实现了一个定期将进度传递给主节点的函数。

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

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

1 个答案:

答案 0 :(得分:4)

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

IPython附带an example脚本,可监控所有引擎的stdout / err,可以轻松调整以监控此信息的子集等。

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

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