清除队列中的所有项

我怎样才能清除一个队列。例如,我在一个队列中有数据,但由于某种原因,我不需要现有的数据,只想清除该队列。

有什么办法吗? 这个能行吗:

oldQueue = Queue.Queue()
105864 次浏览
q = Queue.Queue()
q.queue.clear()

剪辑 为了清晰和简洁,我省略了线程安全问题,但是@Dan D 非常正确,以下内容更好。

q = Queue.Queue()
with q.mutex:
q.queue.clear()

您只是无法清除队列,因为每个 put 都会添加未完成的 _ asks 成员。 Join 方法依赖于此值。 还需要通知 all _ asks _ done。

with q.mutex:
q.queue.clear()
q.all_tasks_done.notify_all()
q.unfinished_tasks = 0

或者以体面的方式,使用 get 和 task _ done 对来安全地清除任务。

    while not q.empty():
try:
q.get(block=False)
except Empty:
continue
q.task_done()

或者只是创建一个新的 Queue 并删除旧的。

这似乎对我来说做得很好。我欢迎评论/补充,以防我遗漏了什么重要的东西。

class Queue(queue.Queue):
'''
A custom queue subclass that provides a :meth:`clear` method.
'''


def clear(self):
'''
Clears all items from the queue.
'''


with self.mutex:
unfinished = self.unfinished_tasks - len(self.queue)
if unfinished <= 0:
if unfinished < 0:
raise ValueError('task_done() called too many times')
self.all_tasks_done.notify_all()
self.unfinished_tasks = unfinished
self.queue.clear()
self.not_full.notify_all()