【发布时间】:2011-06-07 06:15:10
【问题描述】:
更新:这个问题是基于 Queue.get() 实际行为方式的错误心理模型,这是由一些稍微模棱两可的文档引起的,但主要是由 timedelta.total_seconds() 的错误手动实现引起的。当我试图证明原始答案不正确时,我发现了这个错误。现在timedelta.total_seconds() 由 Python 提供(自 2.7 起),我将继续使用它。
很抱歉给您带来了困惑。
这不是“为什么我的代码无法运行?”问题,而是“这个设计决策背后的动机是什么?”
从 2.3 开始,Python 的 queue 模块包含一个带有 get 方法的 Queue 类,该方法接受一个超时参数。这是手册中的部分:
Queue.get([block[, timeout]])
从队列中移除并返回一个项目。如果可选的 args 块为真并且超时为无(默认值),则在必要时阻止,直到项目可用。如果 timeout 是一个正数,它会阻塞 最多 秒 timeout 秒,如果在那段时间内没有可用的项目,则会引发 Empty 异常。 [...]
(强调我的)
请注意,它可能会引发 Empty 异常即使它没有达到超时时间。事实上,我在 Ubuntu(但不是 Windows)上看到了这种行为。它只是提前了一点,它对我的代码产生了轻微的影响 - 不过我可以围绕它编写代码。
大多数阻塞超时都采用最小超时,这在非实时操作系统(包括 Windows 和 Linux)上是有意义的。无法保证操作系统会在任何给定的截止日期前切换到您的进程或线程。
但是,这需要 最大 超时。谁能解释一下这个设计决策如何有意义?
【问题讨论】: