在qsize()的文档中说:返回队列的大致大小。
为什么不能返回这个队列的确切大小呢?我理解队列可能会被多个线程访问,但在我调用函数的那一刻,似乎仍然可以返回那一时刻的确切大小。
为什么不能返回这个队列的确切大小呢?我理解队列可能会被多个线程访问,但在我调用函数的那一刻,似乎仍然可以返回那一时刻的确切大小。
这是因为其他线程也在访问它。当你尝试使用从qsize()返回的大小时,队列可能已经改变。更好的文档应该像这样:
返回队列的大小。请注意,在多线程环境中,大小可能随时发生变化,这只是实际大小的近似值。
t1
时队列的大小为7,并不意味着当你稍后推入或弹出值时它仍将是大小为7。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)
q.get
和异常处理是最好的线程安全获取队列中数据的方式。 - Ned Batchelder