在Python中打印队列的内容

时间:2019-02-12 18:21:16

标签: python logging queue

如果我使用的是python模块queue.Queue,我希望能够使用一种不会弹出原始队列或创建新队列对象的方法来打印内容。

我尝试着进行获取然后放回内容,但这成本太高了。

# Ideally it would look like the following
from queue import Queue
q = Queue()
q.print()
q.put(1)
q.print()

>> [] # Or something like this
>> [1] # Or something like this

4 个答案:

答案 0 :(得分:1)

>>> print(list(q.queue))

这对您有用吗?

答案 1 :(得分:1)

假设您正在使用puthon2。 您可以使用类似这样的内容:

from queue import Queue
q = Queue.Queue()
q.put(1)
q.put(2)
q.put(3)
print q.queue

您也可以在其上循环播放:

for q_item in q.queue:
    print q_item

但是除非您要处理线程,否则我将使用普通列表作为Queue实现。

答案 2 :(得分:1)

对不起,我回答这个问题有点晚了,但是在this comment之前,我根据您的要求扩展了多处理程序包中的队列。希望它将对将来的人有所帮助。

import multiprocessing as mp
from multiprocessing import queues


class IterQueue(queues.Queue):

    def __init__(self, *args, **kwargs):
        ctx = mp.get_context()
        kwargs['ctx'] = ctx
        super().__init__(*args, **kwargs)

    # <----  Iter Protocol  ------>
    def __iter__(self):
        return self

    def __next__(self):
        try:
            if not self.empty():
                return self.get()  # block=True | default
            else:
                raise StopIteration
        except ValueError:  # the Queue is closed
            raise StopIteration

下面是我编写的IterQueue的示例用法:

def sample_func(queue_ref):
    for i in range(10):
        queue_ref.put(i)


IQ = IterQueue()

p = mp.Process(target=sample_func, args=(IQ,))
p.start()
p.join()

print(list(IQ))  # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

我已经在一些更复杂的情况下测试了IterQueue,它似乎运行良好。让我知道您是否认为这可行,否则在某些情况下可能会失败。

答案 3 :(得分:-1)

如果您不使用队列,则最常用的打印队列内容的方法是使用以下代码片段:

class Queue:

    def __init__(self):
     self.items = []

 
    def push(self, e):
      self.items.append(e)
 
    def pop(self):
      head = self.items[0]
      self.items = self.item[1:]
      return head

    def print(self):
      for e in self.items:
          print(e)
q = Queue()
q.push(1)
q.push(23)
q.print()

输出

1
23