我该如何清除队列.例如,我在队列中有数据,但由于某种原因,我不需要现有数据,只想清除队列.
有什么办法吗?这会工作:
oldQueue = Queue.Queue()
Run Code Online (Sandbox Code Playgroud)
Rob*_*wie 84
q = Queue.Queue()
q.queue.clear()
Run Code Online (Sandbox Code Playgroud)
编辑 为了清晰和简洁,我省略了线程安全的问题,但@Dan D非常正确,以下是更好的.
q = Queue.Queue()
with q.mutex:
q.queue.clear()
Run Code Online (Sandbox Code Playgroud)
V.E*_*E.O 31
你只是无法清除队列,因为每个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()
Run Code Online (Sandbox Code Playgroud)
或以合适的方式,使用get和task_done对来安全地清除任务.
while not q.empty():
try:
q.get(False)
except Empty:
continue
q.task_done()
Run Code Online (Sandbox Code Playgroud)
或者只是创建一个新的队列并删除旧的队列.
这对我来说似乎做得很好。如果您错过了任何重要事项,我都欢迎发表评论/添加。
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()
Run Code Online (Sandbox Code Playgroud)