如果我使用的是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
答案 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