我已经使用设置了一个集群
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 跟踪远程发生的长进程?
stdout 已被捕获、记录和跟踪,并在结果完成之前到达客户端。
IPython 附带一个例子 https://github.com/ipython/ipyparallel/blob/master/examples/iopubwatcher.py监视所有引擎的标准输出/错误的脚本,可以轻松调整该脚本以仅监视此信息的子集等。
在客户端本身,您可以检查 stdout/err 的元数据字典(Client.metadata[msg_id].stdout
)在结果完成之前。使用Client.spin()
刷新 Zeromq 套接字中的任何传入消息,以确保该数据是最新的。
如果您希望标准输出经常更新,请确保您调用sys.stdout.flush()
以保证流在此时实际发布,而不是依赖于隐式刷新,这在工作完成之前可能不会发生。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)