2010-12-04 58 views
5

我在探索Python多處理模塊,不明白爲什麼下面的代碼根本不打印任何東西。如果沒有while循環,程序會按預期打印Worker_1。Python多處理:在工作函數中沒有while循環輸出

import multiprocessing, time 

def worker1(): 
    print 'Worker_1' 
    while 1: 
     print 'Worker_1' 
     time.sleep(3) 
    return 

if __name__ == '__main__': 
    jobs = [] 
    p = multiprocessing.Process(target=worker1) 
    jobs.append(p) 
    p.start() 
+0

我不是多處理模塊的主人,現在我不能測試它,但是嘗試在你的`p.start()`之後添加`p.join()`。如果主程序在子進程啓動後退出,子進程是否繼續?我不這麼認爲,但我不知道。請注意,這意味着您需要做一些詭計,以便在您需要時停止該工作人員。或者,也許可以查看叉子模塊。 – 2010-12-04 21:38:21

回答

2

在我的系統上(Python 2.6 & 2.7在Linux上),按預期工作。你在使用哪個平臺?在某些平臺(Windows)上,fork可能是通過創建一個全新的過程並進行設置來仿效的。我懷疑有些stdout沒有轉移到子進程。請嘗試:

  • threading模塊。如果你只是想等待線程中的事件就足夠了。
  • 在POSIX兼容的平臺上運行您的程序,如BSD,Linux或Solaris
  • 輸出到文件
+0

目前我在Windows上使用Eclipse和PyDev。輸出到文件也不起作用。我只是得到一個空文件。我不明白的是while循環的意義。輸出沒有循環,但沒有輸出。 – chessweb 2010-12-05 17:59:52

+0

嘗試添加sys.stdout.flush()也許? – 2010-12-05 23:23:57

0

您使用的空閒?我認爲這是問題。從命令行調用時,您在Linux中爲我工作的代碼(每3秒打印一次'Worker_1')。當我在IDLE中嘗試它時,它立即停止。這是因爲您沒有p.join(),導致主進程立即停止,然後停止工作進程。顯然,p.join()並不是Linux中的命令行所必需的,儘管我會推薦它。

但是,即使使用p.join()並使用IDLE,腳本也只是在那裏,我們看不到任何文本。我認爲,這是因爲IDLE將stdout重新路由到idlelib.rpc.RPCProxy的奇怪方式。換句話說,如果您使用IDLE,那麼這就是您的問題。