python queue.get(block = false),带有非空排队.它可以提高队列



我正在使用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吗?

谢谢!

Nget()的第一个调用将成功;q.get(block=False)仅在队列实际为空时才提高Queue.Empty。线程对get的所有调用均已同步,因此获得 Queue使用的静音的第一个N线程将成功地从Queueget一个项目。如果您的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)

最新更新