2012-07-21 113 views
7

在qsize()的doc中表示:返回队列的近似大小。为什么Python的Queue在qsize()中返回近似大小?

为什么它不能返回此队列的确切大小?我明白队列可以被多个线程访问,但是现在我称之为函数,我认为仍然有可能返回那个时刻的确切大小。

+1

什么时刻?队列大小在方法返回期间可能已经改变。 – 2012-07-21 12:33:29

回答

24

正是因为有其他线程访问它。在尝试使用从qsize()返回的大小时,队列可能已更改。如果文档中读到这样的内容会更好:

返回队列的大小。请注意,在多线程环境中,大小可以随时更改,这只是实际大小的近似值。

5

我同意“近似”不是的话最明显的选择,但斯内德提到他们正在试图指出,仅仅是因为排队的时刻t1大小为7,并不意味着它会当您稍后推送或弹出数值时仍然是7号。

问题是,假设从qsize返回的大小在您将某个值从该队列推入/弹出时可能会在多线程环境中意外行为时仍然正确。

例如:

q = Queue() 
if q.qsize > 0: # size is 1 here 
    # another thread runs here and gets an item from your queue 
    # this get fails and throws an exception in your thread: 
    item = q.get(False) 
    # do whatever processing with item you need to do 

这是LBYL的一个例子,它在多线程访问的队列中,因为潜在的竞争条件很危险了“三思而后行展望”。

在这种情况下,你应该有利于EAFP或“更容易请求原谅比许可”并执行以下操作:

from Queue import Queue, Empty 
import time 
q = Queue() 
try: 
    item = q.get(False) 
    # do whatever processing with item you need to do 
except Empty: 
    time.sleep(1) 
+0

..或者只是使用信号量来保证队列中有条目。 – 2012-07-21 12:37:47

+6

队列已经同步,不要在顶部添加更多。使用'q.get'的例外是获取项目的最佳线程安全方式。 – 2012-07-21 13:52:05

相关问题