복붙노트

[PYTHON] 대기열의 모든 항목 지우기

PYTHON

대기열의 모든 항목 지우기

대기열을 지우려면 어떻게해야합니까? 예를 들어, 대기열에있는 데이터가 있지만 어떤 이유로 기존 데이터가 필요하지 않고 대기열을 지우고 싶습니다.

어떤 방법이 있습니까? 윌이 작동 :

oldQueue = Queue.Queue()

해결법

  1. ==============================

    1.

    q = Queue.Queue()
    q.queue.clear()
    

    편집하다 명확성과 간결성을 위해 스레드 안전성 문제는 생략했지만 @Dan D는 매우 정확합니다. 다음이 더 좋습니다.

    q = Queue.Queue()
    with q.mutex:
        q.queue.clear()
    
  2. ==============================

    2.모든 put에 unfinished_tasks 멤버가 추가되기 때문에 대기열을 지울 수 없습니다. 조인 방법은이 값에 따라 다릅니다. 그리고 all_tasks_done도 통보 받아야합니다.

    모든 put에 unfinished_tasks 멤버가 추가되기 때문에 대기열을 지울 수 없습니다. 조인 방법은이 값에 따라 다릅니다. 그리고 all_tasks_done도 통보 받아야합니다.

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

    또는 알맞은 방법으로 get과 task_done 쌍을 사용하여 안전하게 작업을 지울 수 있습니다.

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

    아니면 그냥 새로운 대기열을 만들고 이전 대기열을 삭제하십시오.

  3. ==============================

    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()
    
  4. from https://stackoverflow.com/questions/6517953/clear-all-items-from-the-queue by cc-by-sa and MIT license