Очистить все элементы из очереди - PullRequest
41 голосов
/ 29 июня 2011

Как я могу очистить очередь. Например, у меня есть данные в очереди, но по некоторым причинам мне не нужны существующие данные, и я просто хочу очистить очередь.

Есть ли способ? Будет ли это работать:

oldQueue = Queue.Queue()

Ответы [ 3 ]

78 голосов
/ 29 июня 2011
q = Queue.Queue()
q.queue.clear()

РЕДАКТИРОВАТЬ Я пропустил вопрос безопасности потоков для ясности и краткости, но @Dan D вполне корректен, лучше следующее:

q = Queue.Queue()
with q.mutex:
    q.queue.clear()
30 голосов
/ 18 сентября 2013

Вы просто не можете очистить очередь, потому что к каждому путу также добавляется элемент unfinished_tasks.Метод соединения зависит от этого значения.И 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()

или просто создайте новую очередь и удалитестарый.

4 голосов
/ 08 августа 2015

Мне кажется, это очень хорошо.Я приветствую комментарии / дополнения на случай, если я что-то упустил.

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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...