簡體   English   中英

Python-從非空multiprocessing.Queue獲取Queue.Empty異常

[英]Python--Getting Queue.Empty exception from a nonempty multiprocessing.Queue

我遇到了許多Python用戶相反的問題-我的程序使用的CPU太少。 已經獲得了轉換到多處理以利用我的工作計算機的所有四個核心的幫助,並且因此看到了真正的性能提升。 但是這種改進有些不可靠。 我的程序的CPU使用率似乎隨着它的繼續運行而惡化-即使有六個進程正在運行。 添加一些調試消息后,我發現這是因為我正在生成的某些進程(應該全部運行到完成)都過早地死了。 進程運行的方法的主體是一會兒True循環,而唯一的出路是此代碼塊:

try:
    f = filequeue.get(False)
except Empty:
    print "Done"
    return

在創建子流程之前已填充文件隊列,因此它實際上並不是空的。 一旦實際上為空,所有進程應大致同時退出。 我嘗試將非零超時(0.05)參數添加到Queue.get調用,但這不能解決問題。 為什么我會從非空隊列中獲取Queue.empty異常?

我建議使用filequeue.get(True)而不是filequeue.get(False) 這將導致隊列阻塞,直到有更多元素。

但是,在處理完最后一個元素之后,它將永遠阻塞。

要解決此問題,主進程可以在每個隊列的末尾添加一個特殊的“哨兵”對象。 工人將在看到此特殊對象后終止(而不是依靠隊列的空)。

我有一個類似的問題,從實驗中發現,不閱讀文檔,即使隊列為非空,get(False)仍然可能會虛假地拋出Empty。 在我的用例中,工作人員在隊列中的工作耗盡時必須退出,因此get(True)是不可選項。

我的解決方案是這樣的:我發現,如果在“ exceptEmpty:”塊中,我檢查Queue確實為empty(),則可以正常工作-除非Queue確實為空,否則empty()不會返回True。

我正在使用Python 2.7。

暫無
暫無

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

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