Fro*_*Zzz 12 python multithreading
在qsize()的文档中,它说:返回队列的大致大小.
为什么它不能只返回此队列的确切大小?我理解Queue可能被多个线程访问,但是此刻我调用该函数我认为仍然可以返回该时刻的确切大小.
Ned*_*der 30
正是因为有其他线程访问它.当您尝试使用从qsize()返回的大小时,队列可能已更改.如果文档读取如下内容会更好:
返回队列的大小.请注意,在多线程环境中,大小可以随时更改,使其仅为实际大小的近似值.
我同意'近似'并不是最明确的选择,但是正如Ned提到的那样,他们试图指出,仅仅因为当时队列的大小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
Run Code Online (Sandbox Code Playgroud)
这是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)
Run Code Online (Sandbox Code Playgroud)