Clear all items from the queue

前端 未结 3 1941
无人及你
无人及你 2020-12-13 03:48

How can I clear a queue. For example I have datas in a queue, but for some reason I don\'t need the existing data, and just want to clear the queue.

Is there any wa

相关标签:
3条回答
  • 2020-12-13 04:01

    This seems to do it pretty well for me. I welcome comments/additions in case I missed anything important.

    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()
    
    0 讨论(0)
  • 2020-12-13 04:17
    q = Queue.Queue()
    q.queue.clear()
    

    EDIT I omitted the issue of thread safety for clarity and brevity, but @Dan D is quite correct, the following is better.

    q = Queue.Queue()
    with q.mutex:
        q.queue.clear()
    
    0 讨论(0)
  • 2020-12-13 04:20

    You just can not clear the queue, because every put also add the unfinished_tasks member. The join method depends on this value. And all_tasks_done needs to be notified also.

    q.mutex.acquire()
    q.queue.clear()
    q.all_tasks_done.notify_all()
    q.unfinished_tasks = 0
    q.mutex.release()
    

    or in decent way, use get and task_done pair to safely clear the tasks.

    while not q.empty():
        try:
            q.get(False)
        except Empty:
            continue
        q.task_done()
    

    or just create a new Queue and delete old one.

    0 讨论(0)
提交回复
热议问题