Подтвердить что ты не робот

Очистить все элементы из очереди

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

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

oldQueue = Queue.Queue()
4b9b3361

Ответ 1

q = Queue.Queue()
q.queue.clear()

ИЗМЕНИТЬ Я пропустил проблему безопасности потоков для ясности и краткости, но @Dan D вполне корректен, лучше.

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

Ответ 2

Вы просто не можете очистить очередь, потому что каждый put также добавляет член 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()

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

Ответ 3

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

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