2009-08-19 90 views
6

Queue模块的queue类中,有几种方法,即qsize,emptyfull,其文档声称它们“不可靠”。Python:为什么Queue.queue的某些方法“不可靠”?

究竟是不是可靠的关于他们?

我也注意到,on the Python docs网站,以下是说,大约qsize

注意,QSIZE()> 0不保证 一个后续的get()不会 块,也不会QSIZE ()< maxsize 保证put()不会阻塞。

我个人认为这种行为“不可靠”。但是,这是什么意思是“不可靠的”,还是在这些方法中还有一些更险恶的缺陷?

+0

给你指的是特定的文档的链接将是很好。 – 2009-08-19 17:28:30

+3

该文档没用。你不能仅仅在文档中说“这个函数不可靠”你需要准确地说出它的不可靠性。 – 2009-08-19 17:32:11

+0

毫无疑问http://docs.python.org/library/queue.html。 – 2009-08-19 17:33:10

回答

2

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

不可靠性的一个可能来源:通常,队列由一个线程读取并由另一个线程写入。如果你是唯一访问队列的线程,那么可以实现qsize(),empty()和full()的可靠实现。但是一旦其他线程卷入其中,这些方法的返回值可能会在您测试它时发生过时。

+0

队列。py,是标准库的一部分。 – 2009-08-19 17:35:56

+0

Python的标准库中有一个Queue.py模块,我在问题中添加了对其文档的评论。来源位于http://svn.python.org/view/python/trunk/Lib/Queue.py?view=markup。 – 2009-08-19 17:40:28

+0

好吧,我愚蠢地认为队列不能在stdlib中,因为它不符合PEP8命名约定。我想这是一个例外。感谢您的链接! – user9876 2009-08-20 15:41:27

10

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

+3

“不可靠”暗示了许多问题。这些函数对于某些用例应该是完全可靠的(例如,检测插入是否可能阻塞来自具有单个生产者线程的队列)。 “不可靠”毫无意义。 – 2009-08-19 17:34:48

+1

@Alex Martelli:qsize报告的尺寸现在不能是尺寸?毕竟,qsize的调用者持有互斥量,这意味着它是当时访问队列的唯一线程。或者在“完成调用qsize之后”正在使用“立即”这个词? – 2009-08-19 17:38:16

+3

调用者线程持有互斥锁时返回的大小 - 作为“返回”的一部分释放(在'finally'中)。这比调用者线程中的调用代码接收结果的时刻早。 “现在”是结果绑定到变量或以任何其他方式使用的时刻:到那个时候,绑定或以其他方式使用的结果可能已经过时。 – 2009-08-19 18:13:56

相关问题