python 스레드 우선순위 대기열 지식점 총결산

3677 단어 python라인
파이썬의 Queue 모듈에는 FIFO(선입선출) 대기열Queue, LIFO(후입선출) 대기열LifoQueue, 우선순위 대기열PriorityQueue 등 동기화되고 안전한 대기열 클래스가 제공됩니다.

1. 설명


이 대기열들은 모두 원어를 잠그고 다중 노드에서 직접 사용할 수 있으며 대기열을 사용하여 노드 간의 동기화를 실현할 수 있다.
모듈에서 자주 사용하는 방법은 다음과 같습니다.
  • Queue.qsize () 는 대기열의 크기를 되돌려줍니다
  • Queue.empty () 대기열이 비어 있으면 True로 돌아가고 False로 돌아갑니다
  • Queue.full () 대기열이 가득 차면 True, 반대로 False로 돌아갑니다
  • Queue.full는 maxsize 크기와 대응합니다
  • Queue.get ([block[,timeout]]]) 대기열, timeout 대기 시간을 가져옵니다
  • Queue.get_nowait()는 상당히 Queue입니다.get(False)
  • Queue.put (item) 대기열 쓰기,timeout 대기 시간
  • Queue.put_nowait(item)은 상당히 Queue입니다.put(item, False)
  • Queue.task_done () 작업을 완료한 후Queue.task_done () 함수는 작업이 끝난 대기열에 신호를 보냅니다
  • Queue.join () 은 사실상 대기열이 비어 있을 때까지 기다렸다가 다른 동작을 실행하는 것을 의미합니다
  • 2. 인스턴스

    
    #!/usr/bin/python3
    import queue
    import threading
    import time
    exitFlag = 0
    class myThread (threading.Thread):
      def __init__(self, threadID, name, q):
        threading.Thread.__init__(self)
        self.threadID = threadID
        self.name = name
        self.q = q
      def run(self):
        print (" :" + self.name)
        process_data(self.name, self.q)
        print (" :" + self.name)
    def process_data(threadName, q):
      while not exitFlag:
        queueLock.acquire()
        if not workQueue.empty():
          data = q.get()
          queueLock.release()
          print ("%s processing %s" % (threadName, data))
        else:
          queueLock.release()
        time.sleep(1)
    threadList = ["Thread-1", "Thread-2", "Thread-3"]
    nameList = ["One", "Two", "Three", "Four", "Five"]
    queueLock = threading.Lock()
    workQueue = queue.Queue(10)
    threads = []
    threadID = 1
    #  
    for tName in threadList:
      thread = myThread(threadID, tName, workQueue)
      thread.start()
      threads.append(thread)
      threadID += 1
    #  
    queueLock.acquire()
    for word in nameList:
      workQueue.put(word)
    queueLock.release()
    #  
    while not workQueue.empty():
      pass
    #  
    exitFlag = 1
    #  
    for t in threads:
      t.join()
    print (" ")
    지식 포인트 확장:
    문제
    어떻게 우선순위에 따라 정렬된 대열을 실현합니까?그리고 이 대기열에서 매번 팝 작업이 우선순위가 가장 높은 요소를 되돌려줍니다.
    솔루션
    다음 클래스는 heapq 모듈을 이용하여 간단한 우선순위 대기열을 실현했다.
    
    import heapq
    
    class PriorityQueue:
     def __init__(self):
     self._queue = []
     self._index = 0
    
     def push(self, item, priority):
     heapq.heappush(self._queue, (-priority, self._index, item))
     self._index += 1
    
     def pop(self):
     return heapq.heappop(self._queue)[-1]
    다음은 사용 방법입니다.
    
    >>> class Item:
    ... def __init__(self, name):
    ...  self.name = name
    ... def __repr__(self):
    ...  return 'Item({!r})'.format(self.name)
    ...
    >>> q = PriorityQueue()
    >>> q.push(Item('foo'), 1)
    >>> q.push(Item('bar'), 5)
    >>> q.push(Item('spam'), 4)
    >>> q.push(Item('grok'), 1)
    >>> q.pop()
    Item('bar')
    >>> q.pop()
    Item('spam')
    >>> q.pop()
    Item('foo')
    >>> q.pop()
    Item('grok')
    >>>
    이python 라인 우선 순위 대기열에 대한 지식을 정리한 이 글은 여기까지 소개합니다. 더 많은 관련python 라인 우선 순위 대기열에 어떤 내용이 있는지 저희 이전의 글을 검색하거나 아래의 관련 글을 계속 훑어보십시오. 앞으로 많은 응원 부탁드립니다!

    좋은 웹페이지 즐겨찾기