我正在使用python的队列来同步多个线程。首先,队列填充了n个元素,如
中N = 10
q = Queue.Queue()
for i in range(N):
q.put(i)
然后,几个线程用块= false
消耗队列中的元素q.get(block=False)
我的问题是:以前的呼叫可以在第一个n个呼叫中提高queue.get()提高queue.empty吗?
谢谢!
N
对get()
的第一个调用将成功;q.get(block=False)
仅在队列实际为空时才提高Queue.Empty
。线程对get
的所有调用均已同步,因此获得 Queue
使用的静音的第一个N线程将成功地从Queue
中 get
一个项目。如果您的n 1或更多线程,则nth以外的任何get
都会升高Queue.Empty
。通过查看Queue
代码的相关部分,这很容易看到,如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)