2012-03-22 43 views
4

我已經設置了使用從讀取從節點標準輸出與ipcluster

ipcluster start --n=8 

羣集然後使用

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

我從節點上運行的進程訪問它(E [0 ] -e [7]),這需要花費很多時間,我希望他們向主人發送進度報告,以便我能夠關注他們的進展情況。

我可以通過兩種方式來做到這一點,但目前爲止我還沒有能夠實現其中任何一種,儘管通過問題頁面進行了幾個小時的拖網。

我希望節點在沒有提示的情況下將一些數據推回給主服務器。即在節點上運行的長期過程中,我實現了一個功能,它定期將其進度傳遞給主節點。

或者我可以將節點的stdout重定向到master的stdout,然後使用print來跟蹤進度。這是我迄今爲止所做的工作。每個節點都有自己的標準輸出,因此如果遠程運行,打印不會執行任何操作。我已經嘗試將sys.stdout推送到節點,但這只是關閉它。

我不敢相信我是唯一一個想要這樣做的人,所以也許我錯過了一件非常簡單的事情。我如何跟蹤使用ipython進行遠程進程?

回答

4

stdout已被捕獲,記錄和跟蹤,並在結果完成之前到達客戶端。

IPython的附帶an example腳本監控所有的發動機,它可以很容易地調整,以只的標準輸出/ ERR監控此信息的子集等

在客戶端本身,你可以檢查元數據字典結果完成之前,stdout/err(Client.metadata[msg_id].stdout)。使用Client.spin()從zeromq套接字中清除所有傳入消息,以確保此數據是最新的。

如果您希望頻繁更新stdout,請確保您致電sys.stdout.flush()以確保該流實際上是在那一刻發佈的,而不是依賴隱式刷新,這可能在工作完成之前不會發生。

+0

謝謝,這正是我所追求的。 – 2012-03-27 15:05:06