【发布时间】:2018-08-16 18:16:02
【问题描述】:
我有一个循环处理的队列
while True:
# a processing loop
batch = []
while True:
e = q.get()
if e:
batch.append(e)
else:
# the queue is empty
break
do_something_with(batch)
# wait a moment before emptying the queue again
time.sleep(2)
这个想法是清空队列,处理其内容并等待片刻,然后再次检查内容。
我有时会遇到一个竞争条件,当我 get() 一个元素时,队列被填充,我最终得到一个不断增长的 batch,它永远不会被进一步处理。
一种解决方案是检查batch 大小并在大小合适时对其进行处理。如果我没有太多事件进入队列并且batch 从未达到正确的大小,这将不起作用 - 但我需要处理事件(无论它们的数量是多少)而不是等到足够的累积。
第二种解决方案是根据大小和batch 空闲的时间来构建检查——这会使代码过于复杂。
一个好的解决方案是“一次从队列中获取n 元素”。我在文档中找不到类似的东西。 有没有办法一次从队列中弹出多个元素(例如对列表进行切片)?
【问题讨论】:
标签: python python-3.x queue