【问题标题】:Python: Why are some of Queue.queue's method "unreliable"?Python:为什么 Queue.queue 的某些方法“不可靠”?
【发布时间】:2009-08-19 17:22:43
【问题描述】:

在来自Queue 模块的queue 类中,有几个方法,即qsizeemptyfull,它们的文档声称它们“不可靠”。

他们到底有什么不可靠的地方?

我确实注意到了on the Python docs这个网站,下面说的是qsize

注意,qsize() > 0 不保证 随后的 get() 不会 块,qsize()

我个人认为这种行为“不可靠”。但这就是所谓的“不可靠”,还是这些方法有更险恶的缺陷?

【问题讨论】:

  • 您所指的特定文档的链接会很好。
  • 文档没用。您不能只在文档中说“此功能不可靠”;你需要准确地说出它的不可靠之处。
  • @Glenn,请看docs.python.org/library/queue.html:那里没有出现“可靠”和“不可靠”这两个词。代码中简洁的单行文档字符串确实使用“不可靠”作为有用的速记,当然,您可以转到手册了解完整的详细信息:它远非 useless另外_在手册中的完整描述中自行编码。
  • 事实上,当前的文档(Google 将我链接到旧文档)已经取代了 2.5 版的文档,后者非常清楚地说“不可靠”(python.org/doc/2.5.2/lib/QueueObjects.html)。显然 Python 的人同意我的观点,因为他们用真实的描述替换了无用的 2.5 文本。失去态度,不要不要教训我。

标签: python multithreading queue


【解决方案1】:

是的,文档在这里使用“不可靠”来准确传达这个含义:例如,在某种意义上,qsize 并没有告诉你“现在”有多少条目,这个概念不一定非常在多线程世界中有意义(除了在采取同步预防措施的特定点)——它告诉你它“不久前”有多少条目......当你对该信息采取行动时,即使在下一个操作码中,队列可能有更多条目,也可能更少,或者根本没有,这取决于同时其他线程在做什么(如果有的话;-)。

【讨论】:

  • “不可靠”暗示了许多问题。这些函数对于某些用例应该是完全可靠的(例如,从具有单个生产者线程的队列中检测插入是否可能阻塞)。 “不可靠”是没有意义的。
  • @Alex Martelli:qsize 报告的大小怎么可能不是现在的大小?毕竟,qsize 的调用者持有互斥锁,这意味着它是当时唯一访问队列的线程。还是使用“现在”一词,如“在您完成调用 qsize 之后之后”?
  • 这是调用者线程持有互斥锁时“返回”的大小——它作为return的一部分被释放(在finally中);这比调用者线程中的调用代码接收结果的时刻更早。 “现在”是结果被绑定到变量或以任何其他方式使用的时刻:到那时,被绑定或以其他方式使用的结果可能已经过时了。
  • @Glenn,请参阅我对您对该问题的评论的回复评论:远非毫无意义或无用,所讨论的极其简洁的摘要有用且有意义地提醒读者手册中更详细的解释。例如即使full 是真的,这并不意味着即使在单个生产者场景中你也会阻塞......下一刻它可能不再是真的(在这种极其特殊的情况下,你知道没有其他线程会导致错误- >true 转换,但您不知道 true->false 转换即使在这样的人工场景中!-)。
【解决方案2】:

我不知道你指的是哪个队列模块,请你提供一个链接吗?

一种可能的不可靠性来源:通常,一个队列由一个线程读取并由另一个线程写入。如果您是唯一访问队列的线程,那么 qsize()、empty() 和 full() 的可靠实现是可能的。但是一旦涉及到其他线程,这些方法的返回值在您测试时可能已经过时了。

【讨论】:

  • Queue.py,标准库的一部分。
  • Python 的标准库中有一个 Queue.py 模块,我在问题中添加了 cmets 以指向其文档。来源在svn.python.org/view/python/trunk/Lib/Queue.py?view=markup
  • 啊,好吧,我愚蠢地认为 Queue 不能在 stdlib 中,因为它不符合 PEP8 命名约定。我想这是个例外。感谢您的链接!
【解决方案3】:

这是与 Alex Martelli 所建议的一致的不可靠案例: JoinableQueue.empty() unreliable? What's the alternative?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-14
    • 2020-12-10
    • 2010-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多