Как я могу очистить очередь. Например, у меня есть данные в очереди, но по какой-то причине мне не нужны существующие данные и просто хочу очистить очередь.
Есть ли какой-нибудь способ? Будет ли эта работа:
oldQueue = Queue.Queue()
Ответ 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 также должен быть уведомлен.
или по-достойному, используйте пары 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()