我怎样可以清空一个队列。比如说,我当前有一些数据在队列里,但是由于某种原因我不需要这些数据了,只想要清空队列。
有什么方法吗?这个行得通吗:
oldQueue = Queue.Queue()
q = Queue.Queue()
q.queue.clear()
编辑 为了清晰简洁,我忽略了线程安全的问题,但@Dan D是正确的,以下内容更好。
q = Queue.Queue()
with q.mutex:
q.queue.clear()
with q.mutex: q.queue.clear()
这个操作,它将是线程安全的。 - Dan D.. mutex
和. queue
似乎没有文档,如果我没有弄错的话,在其块内部执行任何类似于甚至是q.get_nowait
的操作会导致q.mutex
死锁。 - n611x007你无法清空队列,因为每次放入元素都会增加 unfinished_tasks 的成员。 join 方法依赖于该值。 并且还需要通知 all_tasks_done。
with q.mutex:
q.queue.clear()
q.all_tasks_done.notify_all()
q.unfinished_tasks = 0
while not q.empty():
try:
q.get(block=False)
except Empty:
continue
q.task_done()
或者创建一个新的队列并删除旧的队列。
对我来说,这似乎做得很好。如果我漏掉了什么重要的东西,欢迎发表评论/补充。
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()
.clear()
)和正确(包括当前处理项的通知)的方法。 - freakish q = Queue(maxsize=max_size)
q.put(1)
q.put(2)
q.put(3)
q.put(4)
q = Queue(maxsize=max_size)
deque
。在deque
的文档中,你会注意到它有一个clear()
方法,这正是你想要的。你可能还想将该调用包装在q.mutex.acquire()
和q.mutex.release()
中,就像代码中对这类操作的其余部分一样,以使其线程安全。 - martineau