Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Queue.get(block=False)具有非空队列。它能把队列清空吗?_Python_Multithreading - Fatal编程技术网

Python Queue.get(block=False)具有非空队列。它能把队列清空吗?

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)只会在队列

我正在使用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)
只会在队列实际为空时引发
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)