清除队列中的所有项目

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了清除队列中的所有项目相关的知识,希望对你有一定的参考价值。

我该如何清除队列。例如,我在队列中有数据,但由于某种原因,我不需要现有数据,只想清除队列。

有什么办法吗?这会工作:

oldQueue = Queue.Queue()
答案
q = Queue.Queue()
q.queue.clear()

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

q = Queue.Queue()
with q.mutex:
    q.queue.clear()
另一答案

你只是无法清除队列,因为每个put也会添加unfinished_tasks成员。 join方法取决于此值。并且还需要通知all_tasks_done。

q.mutex.acquire()
q.queue.clear()
q.all_tasks_done.notify_all()
q.unfinished_tasks = 0
q.mutex.release()

或以合适的方式,使用get和task_done对来安全地清除任务。

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

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

另一答案

这似乎对我来说非常好。我欢迎评论/补充,以防我错过任何重要的事情。

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()

以上是关于清除队列中的所有项目的主要内容,如果未能解决你的问题,请参考以下文章

ActiveMQ - 通过命令行删除/清除所有队列

rabbitmq - 不会获取队列中的所有消息

perl中的队列

如何以挂起的意图启动 Activity 并清除所有后台堆栈?

导航到Android中的另一个片段后如何清除导航堆栈

如何清空Windows消息队列