【发布时间】:2017-01-06 03:46:27
【问题描述】:
我需要以阻塞方式从队列中获取尽可能多的项目(最多 N 个)。例如:
queue.get(16)
应该返回最多 16 个元素,但如果为空则阻塞。
【问题讨论】:
我需要以阻塞方式从队列中获取尽可能多的项目(最多 N 个)。例如:
queue.get(16)
应该返回最多 16 个元素,但如果为空则阻塞。
【问题讨论】:
没有内置这样的工具,因此您需要自己编写代码;例如,
import queue # in Python 3; Queue in Python 2
...
def getn(q, n):
result = [q.get()] # block until at least 1
try: # add more until `q` is empty or `n` items obtained
while len(result) < n:
result.append(q.get(block=False))
except queue.Empty:
pass
return result
然后为您的概念性queue.get(16) 执行getn(queue, 16)。
【讨论】:
.task_done()除非您也尝试在队列上使用.join(),并且相对较少的队列抛掷代码使用其中任何一个。如果您正在使用这些,在不知道代码的逻辑(意图)认为“完成”到意味着的情况下仍然无法回答。
如果队列为空,它会等待 3 秒。它返回最后一个不是完整的批次。
def get_batch_from_queue(q, batch_size):
item_list = []
try:
for i in range(batch_size):
item_list.append(q.get(block=True, timeout=3))
return item_list
except queue.Empty:
if(len(item_list)==0):
return None
else:
return item_list
while True:
batch = get_batch_from_queue(q, batch_size=8)
if batch == None:
break
print('len(batch)', len(batch))
【讨论】: