2016-02-09 24 views
0

python紀錄片中的多重處理Process類示例似乎返回None。我複製粘貼示例並運行它,但它只返回「>>>」,而不是打印'hello',名稱。測試2.7.11和3.5.1。我必須在這裏忽略一些明顯的東西,但不知道是什麼。Python多重處理不會返回任何信息

from multiprocessing import Process 

def f(name): 
    print('hello', name) 

if __name__ == '__main__': 
    p = Process(target=f, args=('bob',)) 
    p.start() 
    p.join() 

- 編輯 - 它在Linux Ubuntu 14.04中工作。不在Windows 7中。 - 編輯 - 似乎主要問題是它是從IDLE還是從文件運行。從文件運行時工作。

+1

我砍/你的代碼粘貼到'idle',我讓你得到了什麼。如果我把它放到一個文件中並執行這個文件,我會得到預期的結果。 – Marichyasana

+0

謝謝,這是我錯過的答案:) – janskis

回答

1

由於您提到了>>>提示,這聽起來像是您正在交互式解釋器中運行示例嗎? 在這種情況下,if __name__ == "__main__"行永遠不會評估爲True,因此永遠不會運行您想要的代碼。您可以在documentation中閱讀這方面的內容。

儘量選擇保存到腳本並運行該腳本,或者只是刪除if -clause:

from multiprocessing import Process 

def f(name): 
    print('hello', name) 

p = Process(target=f, args=('bob',)) 
p.start() 
p.join() 
+0

我相信這是正確的答案。 OP正在使用REPL。我想補充一點,在跳入「multiprocessing」之前,OP應該在Python基礎知識('return'和'print')上工作。 Python'multiprocessing'可以以意想不到的方式運行,並且在處理事務之前需要牢牢掌握事情。 – Jason

+0

從文件運行時工作,但仍不能從交互式解釋器運行。 – janskis

+0

然後我的回答是正確的,你可以在我提供的鏈接中閱讀關於「__name__」的使用。 –

0

首先,返回和打印之間有很大的區別。您的代碼沒有return,所以它只是打印。

其他進程與打印的文本相關的其他進程有不同的stdout。直到您明確將其連接到主流程的stdout或以其他方式處理它,您纔會看到它。 subprocess.Popen()允許這樣做,multiprocessing.Process()並沒有我所知。

+0

「直到你明確地將它連接到主進程的stdout或以其他方式處理它,你纔會看到它。」這是錯誤的。這個問題中的例子與'multiprocessing'文檔中的官方例子是一樣的。所有的過程將使用相同的標準'stdout'。 –