【问题标题】:Multiprocessing queue batch get up to max N elements多处理队列批处理最多可达 N 个元素
【发布时间】:2017-01-06 03:46:27
【问题描述】:

我需要以阻塞方式从队列中获取尽可能多的项目(最多 N 个)。例如:

queue.get(16)

应该返回最多 16 个元素,但如果为空则阻塞。

【问题讨论】:

    标签: python queue


    【解决方案1】:

    没有内置这样的工具,因此您需要自己编写代码;例如,

    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(),并且相对较少的队列抛掷代码使用其中任何一个。如果您正在使用这些,在不知道代码的逻辑(意图)认为“完成”到意味着的情况下仍然无法回答。
    • 原始问题明确要求它“以阻塞方式”工作。
    【解决方案2】:

    如果队列为空,它会等待 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))
    

    【讨论】:

      猜你喜欢
      • 2012-11-12
      • 2017-02-13
      • 2013-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多