gpt4 book ai didi

具有非空队列的 Python Queue.get(block=False)。它可以引发 Queue.empty 吗?

转载 作者:太空宇宙 更新时间:2023-11-04 05:51:24 31 4
gpt4 key购买 nike

我正在使用 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 的所有调用都是同步的,因此获得 Queue 使用的互斥锁的前 N ​​个线程将成功 get Queue 中的项。如果您有 N+1 个或更多线程,则第 N 个之后的任何 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)

关于具有非空队列的 Python Queue.get(block=False)。它可以引发 Queue.empty 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30053464/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com