更新:這個問題是基於Queue.get()的實際行爲方式的錯誤思維模型,這是由一些稍微模糊的文檔引起的,但主要是由一個錯誤的手動實現timedelta.total_seconds()
引起的。當我試圖證明原始答案不正確時,我發現了這個錯誤。現在Python已經提供了timedelta.total_seconds()
(從2.7開始),我將轉而使用它。爲什麼Python的queue.Queue.get()允許從超時提前返回?
對不起,我感到困惑。
這不是「爲什麼我的代碼不運行?」問題,但是「這個設計決定背後的動機是什麼?」
從2.3開始,Python的隊列模塊包含一個帶get方法的Queue類,該方法需要一個超時參數。以下是手冊中的部分:
Queue.get([block[, timeout]])
從隊列中移除並返回一個項目。如果可選參數塊爲true並且超時時間爲無(默認值),則在必要時阻止,直到項目可用。如果超時時間爲正數,則會阻止 至多超時秒數,如果在該時間內沒有可用項目,則會引發空例外。 [...]
(重點煤礦)
注意,這可能會引發空異常即使它沒有達到超時。事實上,我在Ubuntu上看到了這種行爲(但不是Windows)。它只是提前一點退出,它對我的代碼有輕微的影響 - 儘管如此,我仍然可以對它進行編碼。
大多數阻塞超時最少需要超時,這對非實時OS(包括Windows和Linux)有意義。不能保證操作系統會在任何給定的最後期限內切換到您的進程或線程。
但是,這一個需要最大超時。任何人都可以解釋這個設計決定可能有意義嗎?
+1檢查背後Queue.Queue的代碼。這震動了我對我的立場的信心。我本應該這樣做。然而,雖然我很困惑,但這並不是我遇到的困惑。我聲稱線程A在隊列中沒有任何東西在[9.999]醒來。由於執行錯誤,我現在看到我正在睡9.999而不是10。 – Oddthinking 2011-06-07 11:29:09