簡體   English   中英

在IPython並行進程中打印到stdout

[英]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

這是一個筆記本 ,所有這些都證明了這一點。

根據您的問題需要注意的一些事項:

  1. 在輸出就緒之前,你必須等待AsyncResult完成( async.get()
  2. display_outputs()不返回任何內容 - 它實際上是打印/顯示本身,因此print(async.display_outputs())沒有意義。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM