簡體   English   中英

Python多處理進程無法運行

[英]Python multiprocessing process doesn't run

首先,應該提到我是編程的新手,並且我正在使用Python 3.2.5。 我正在嘗試創建一個游戲,該游戲可以定期連接到服務器並對其執行ping操作。 最初,我試圖將此權限簡單地捆綁到游戲的主循環中,結果該循環在ping期間凍結(我的連接速度很慢,我不希望這會抑制游戲性,因為游戲不會這樣做) t完全取決於服務器-它只需要ping它以保持會話打開,以便以后注冊最終分數。

講到重點,我認為我將嘗試對所有與服務器相關的代碼使用輔助循環,這使我進入了多處理。 我當前的想法是保持無限循環運行,並通過隊列向任務饋送任務。 然后,它將通過隊列返回任務執行成功與否的信息,並且游戲可以平穩運行。 我將其簡化為以下內容進行測試,但未打印任何內容。 我顯然想知道為什么。

(我猜很多聰明的人對此有更好的想法。我很聽。)

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))

正如用戶User所評論的那樣,您沒有while q_out.empty == False的那一行中調用empty方法,只是在引用它。 您需要添加一組括號以使其成為調用: 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或列表,而不要順序傳遞它們(不能保證將它們一起接收,而不是在工作進程的兩次傳遞中分開)。

暫無
暫無

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

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