python - metodos - Borrar todos los elementos de la cola
queue python 3 (3)
Esto parece hacerlo bastante bien para mí. Acepto comentarios / adiciones en caso de que me haya perdido algo importante.
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()
¿Cómo puedo borrar una cola? Por ejemplo, tengo datos en una cola, pero por alguna razón no necesito los datos existentes, y solo quiero borrar la cola.
¿Hay alguna manera? Esto funcionara:
oldQueue = Queue.Queue()
Simplemente no puede borrar la cola, porque cada vez que pone también agrega el miembro unfinished_tasks. El método de unión depende de este valor. Y all_tasks_done necesita ser notificado también.
q.mutex.acquire()
q.queue.clear()
q.all_tasks_done.notify_all()
q.unfinished_tasks = 0
q.mutex.release()
o de manera decente, use get y task_done pair para borrar las tareas de forma segura.
while not q.empty():
try:
q.get(False)
except Empty:
continue
q.task_done()
o simplemente crea una nueva cola y elimina la anterior.
q = Queue.Queue()
q.queue.clear()
EDITAR He omitido el tema de la seguridad del hilo para mayor claridad y brevedad, pero @Dan D es bastante correcto, lo siguiente es mejor.
q = Queue.Queue()
with q.mutex:
q.queue.clear()