[英]Printing to stdout in IPython parallel processes
我是IPython的新手,想在運行IPython並行集群功能時將中間結果打印到stdout。 (我知道有多個進程,這可能會破壞輸出,但這很好 - 它只是用於測試/調試,而我正在運行的進程足夠長,以至於不太可能發生此類沖突。)我檢查了IPython的文檔,但找不到並行化函數打印的示例。 基本上,我正在尋找一種方法將子進程的打印輸出重定向到主stdout,IPython相當於
subprocess.Popen( ... , stdout=...)
在流程內打印不起作用:
rc = Client()
dview = rc()
def ff(x):
print(x)
return x**2
sync = dview.map_sync(ff,[1,2,3,4])
print('sync res=%s'%repr(sync))
async = dview.map_async(ff,[1,2,3,4])
print('async res=%s'%repr(async))
print(async.display_outputs())
回報
sync res=[1, 4, 9, 16]
async res=[1, 4, 9, 16]
因此計算正確執行,但函數ff中的print語句永遠不會打印,即使返回所有進程也是如此。 我究竟做錯了什么? 如何讓“打印”工作?
它實際上更像是subprocess.Popen( ... , stdout=PIPE)
不是你想象的那樣。 就像Popen
對象有一個stdout
屬性,您可以讀取該屬性來查看子進程的stdout
,AsyncResult有一個stdout
屬性,其中包含從引擎捕獲的標准輸出。 它的不同之處在於AsyncResult.stdout
是一個字符串列表 ,其中列表中的每個項目都是單個引擎的標准輸出作為字符串。
所以,開始:
rc = parallel.Client()
dview = rc[:]
def ff(x):
print(x)
return x**2
sync = dview.map_sync(ff,[1,2,3,4])
print('sync res=%r' % sync)
async = dview.map_async(ff,[1,2,3,4])
print('async res=%r' % async)
async.get()
給
sync res=[1, 4, 9, 16]
async res=<AsyncMapResult: ff>
我們可以看到AsyncResult.stdout
字符串列表:
print(async.stdout)
['1\n2\n', '3\n4\n']
我們可以看到異步結果的標准輸出:
print('async output:')
async.display_outputs()
打印:
async output:
[stdout:0]
1
2
[stdout:1]
3
4
這是一個筆記本 ,所有這些都證明了這一點。
根據您的問題需要注意的一些事項:
async.get()
) display_outputs()
不返回任何內容 - 它實際上是打印/顯示本身,因此print(async.display_outputs())
沒有意義。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.