在qsize()的doc中表示:返回队列的近似大小。为什么Python的Queue在qsize()中返回近似大小?
为什么它不能返回此队列的确切大小?我明白队列可以被多个线程访问,但是现在我称之为函数,我认为仍然有可能返回那个时刻的确切大小。
在qsize()的doc中表示:返回队列的近似大小。为什么Python的Queue在qsize()中返回近似大小?
为什么它不能返回此队列的确切大小?我明白队列可以被多个线程访问,但是现在我称之为函数,我认为仍然有可能返回那个时刻的确切大小。
正是因为有其他线程访问它。在尝试使用从qsize()返回的大小时,队列可能已更改。如果文档中读到这样的内容会更好:
返回队列的大小。请注意,在多线程环境中,大小可以随时更改,这只是实际大小的近似值。
我同意“近似”不是的话最明显的选择,但斯内德提到他们正在试图指出,仅仅是因为排队的时刻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)
..或者只是使用信号量来保证队列中有条目。 – 2012-07-21 12:37:47
队列已经同步,不要在顶部添加更多。使用'q.get'的例外是获取项目的最佳线程安全方式。 – 2012-07-21 13:52:05
什么时刻?队列大小在方法返回期间可能已经改变。 – 2012-07-21 12:33:29