Python Queue.get(block=False)具有非空队列。它能把队列清空吗?
我正在使用python的Queue.Queue来同步几个线程。首先,用N个元素填充队列,如中所示Python Queue.get(block=False)具有非空队列。它能把队列清空吗?,python,multithreading,Python,Multithreading,我正在使用python的Queue.Queue来同步几个线程。首先,用N个元素填充队列,如中所示 N = 10 q = Queue.Queue() for i in range(N): q.put(i) 然后,几个线程使用block=False的队列中的元素 q.get(block=False) 我的问题是:前一个对Queue.get()的调用能否在前N个调用中的任何一个调用中提升Queue.Empty 谢谢 对get()的第一次N调用将成功q.get(block=False)只会在队列
N = 10
q = Queue.Queue()
for i in range(N):
q.put(i)
然后,几个线程使用block=False的队列中的元素
q.get(block=False)
我的问题是:前一个对Queue.get()的调用能否在前N个调用中的任何一个调用中提升Queue.Empty
谢谢 对
get()
的第一次N
调用将成功q.get(block=False)
只会在队列实际为空时引发Queue.Empty
。线程对get
的所有调用都是同步的,因此获得队列使用的互斥体的前N个线程将成功从队列中获取一个项目。如果有N+1个或多个线程,超过N个的任何get
都将引发队列。为空。通过查看队列
代码的相关部分,您可以很容易地看到这一点,如所述
类队列:
“”“创建具有给定最大大小的队列对象。”。
如果maxsize是,您可能希望阅读以找到这个非常好的答案,谢谢!我将您的答案标记为有效答案,因为您在其中显示了相关代码,但谢谢@Eric。
class Queue:
"""Create a queue object with a given maximum size.
If maxsize is <= 0, the queue size is infinite.
"""
def __init__(self, maxsize=0):
self.maxsize = maxsize
self._init(maxsize)
self.mutex = _threading.Lock()
self.not_empty = _threading.Condition(self.mutex)
... # Stuff we don't care about
def get(self, block=True, timeout=None):
self.not_empty.acquire() # Only on thread can hold this at a time
try:
if not block:
if not self._qsize(): # If there's nothing in the Queue
raise Empty
... # Other stuff we don't care about, since you use block=False
item = self._get()
self.not_full.notify()
return item
finally:
self.not_empty.release()
def _init(self, maxsize):
self.queue = deque()
def _qsize(self, len=len):
return len(self.queue)