gpt4 book ai didi

python - queue.empty 并在空的时候做一个 put

转载 作者:行者123 更新时间:2023-12-05 03:12:19 33 4
gpt4 key购买 nike

假设我有一个包含两个元素的队列。我循环遍历使用 get 弹出项目的队列。恐怕一旦我弹出第二个元素,循环就会停止循环,并且由于某些错误我需要重新处理它。所以我把它放回队列中,但它不会,因为那时队列是空的。

我的循环:

while not queue.empty():  try:    item = queue.get()    do stuff(item):  except Exception as e:    queue.put(item)  queue.task_done()

我阅读了有关 Queue.empty 的文档,但对阻塞及其含义感到困惑; Queue.empty()

最佳答案

如果你正在使用多线程,就像我认为的那样(你为什么还要担心阻塞?),这样做通常不是一个好主意:

if not queue.empty():  # or 'while' instead of 'if'
item = queue.get()

因为另一个线程可能在第一行和第二行之间清空了您的 queue,所以您的 queue.get() 现在会阻塞,直到有新的东西进来,这看起来如果你这样写,这不是预期的行为。基本上 if not queue.empty() 在并发场景中是没有意义的。

正确的做法应该是:

try:
while True:
item = queue.get(block=False)
done = False
while not done:
try:
do stuff(item)
done = True
except Exception as e:
pass # just try again to do stuff
queue.task_done()
except Empty:
pass # no more items

除此之外(如果我们假设没有其他线程可以使用您的队列),代码可以正常工作。我对你是否理解(或“理解”,因为这个问题很老)阻塞的概念有一些严重的怀疑。 如果根据文档某个函数处于“阻塞”状态,那仅意味着代码的执行将在该点停止,直到发生某些事件。 time.sleep(1) 可能是阻塞 1 秒的阻塞函数的最佳示例。

PS:我知道这已经有些年头了,但仍然......

关于python - queue.empty 并在空的时候做一个 put,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34044126/

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