2014-02-23 133 views
0

首先,應該提及的是,我對編程相當陌生,而且我正在使用Python 3.2.5。我正在嘗試創建一個連接到服務器並定期連接服務器的遊戲。起初,我試圖簡單地將這個權利捆綁到遊戲的主循環中,結果是所述循環​​在ping的持續時間內凍結(我的連接速度很慢,並且我不希望這會抑制遊戲,因爲遊戲不會, t完全取決於服務器 - 它只需要ping它就可以保持會話打開,以便稍後註冊最終分數)。Python多處理進程不運行

我想我會嘗試使用所有與服務器相關的代碼的二級循環,這使我得以進行多處理。我目前的想法是保持無限循環運行,並通過隊列爲任務提供任務。然後它會返回信息,表示任務成功或者不通過隊列,並且遊戲可以順利運行。我將其分解爲以下內容進行測試,沒有打印出來。我顯然想知道爲什麼。

(我猜有很多聰明人都對如何做到這一點更好的想法,我洗耳恭聽。)

import multiprocessing 

def aFunction(q_in, q_out): 
    while True: 
     item = q_in.get() 
     q_out.put("some info") 

if __name__ == "__main__": 
    q_in = multiprocessing.Queue() 
    q_out = multiprocessing.Queue() 
    p = multiprocessing.Process(target = aFunction, args = (q_in, q_out)) 

    p.start() 
    q_in.put("some task here") 

    while True: 
     item = q_out.get() 
     print(str(item)) 
+1

'q_out.empty()'? – User

+0

編輯OP來解釋我對這些問題的看法。 – Petto

回答

0

隨着用戶User評論,你不調用empty方法在行while q_out.empty == False,你只是參考它。您需要添加一組圓括號以進行呼叫:while q_out.empty() == False

該問題導致您的主進程永遠不會嘗試get您工作進程的任何回覆,這可能是您爲什麼沒有看到打印結果在你的測試中。

其實,當你編輯上面的線,有一個風格的改進,使:使用not而不是== Falsewhile not q_out.empty()

另一種風格的建議是使用if items而非if len(items) > 0。如果你知道物品是一個集合,它們具有相同的含義。

或者,你可以把衣服脫你的循環方式,只是一次處理一個單一的項目,沒有列表或檢查隊列爲空:如果你需要傳遞一些相關項目放在一起

while True: 
    item = q_out.get() # this will block until another item is available 
    # do stuff with that single item here 

,請使用tuple或列表,而不是按順序傳遞它們(這不能保證它們將一起收到,而不是在工作進程的兩次傳遞之間進行分割)。

+0

我誤解了@User,這似乎很多。無論如何,這是很好的和有益的(相應地修改OP),但我仍然沒有得到任何打印輸出。 – Petto

+0

我測試了你當前在問題中的代碼,並按照我的預期打印了一些信息。它永遠運行,但這在多處理代碼中並不是一個缺陷,只是你只能通過你的隊列發送一個項目,然後當兩個隊列都是空的時候發生死鎖。如果你還有其他的事情要處理你的主循環,你可以帶回'while not q_out.empty()'循環或者做一個非阻塞的'get'來避免這種情況。 – Blckknght

+0

上帝該死的,你說得對。我會在機器上稱這爲鬼,因爲我可以發誓它以前沒有打印任何東西。無論如何,問題解決,並感謝一堆。 – Petto