4

我已经使用

ipcluster start --n=8

然后使用

from IPython.parallel import Client
c=Client()
dview=c[:]
e=[i for i in c]

我正在从节点(e [0]-e [7])上运行进程,这需要很多时间,我希望他们将进度报告发送给主节点,这样我就可以密切关注它们有多远是。

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

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

或者我可以将节点的标准输出重定向到主节点的标准输出,然后使用 print 跟踪进度。这是我迄今为止一直在做的事情。每个节点都有自己的标准输出,因此如果远程运行 print 不会做任何事情。我尝试将 sys.stdout 推送到节点,但这只是关闭它。

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

4

1 回答 1

4

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

IPython 附带了一个示例脚本,用于监控所有引擎的 stdout/err,可以轻松地对其进行调整以仅监控此信息的子集等。

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

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

于 2012-03-23T19:06:26.853 回答