[英]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
而不是== False
: while 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.