更新:这个问题是基于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