Python Asyncio 모듈이 구현한 소비자 모델 생산 방법

asyncio의 키워드 설명
  • event_loop 이벤트 순환: 프로그램이 무한 순환을 열어 일부 함수를 이벤트 순환에 등록하고 이벤트가 발생할 때 해당하는 협정 함수를 호출합니다
  • coroutine 협정: 협정 대상은 async 키워드로 정의된 함수를 가리킨다. 그 호출은 함수를 즉시 실행하지 않고 협정 대상을 되돌려준다. 협정 대상은 이벤트 순환에 등록하고 이벤트 순환으로 호출해야 한다..
  • task 임무: 하나의 협의 대상은 원생적으로 끊을 수 있는 함수이고 임무는 협의 절차를 한층 더 봉인하는 것이다. 그 중에서 임무의 각종 상태를 포함한다
  • future: 장래에 실행되거나 실행되지 않은 임무의 결과를 대표합니다.그것과task는 본질적인 차이가 없다
  • async/await 키워드: async는 협동 과정을 정의합니다. await는 막힌 비동기 호출 인터페이스를 끊는 데 사용되고python3.4에서는 asyncio를 사용합니다.coroutine/yield from
  • 디자인 모델에서 소비자 모델을 생산하는 것은 매우 중요한 위치를 차지한다. 이 모델은 현실 세계에서도 재미있는 대응 장면이 많다. 예를 들어 만두를 만드는 사람과 만두를 먹는 사람은 두 가지 속도가 일치하지 않을 때 하나의 모델이 일치(우합)를 해야 한다. 만두를 만드는 것은 순서대로 소비된다.
    
    import asyncio
    
    class ConsumerProducerModel:
      def __init__(self, producer, consumer, queue=asyncio.Queue(), plate_size=6): # the plate holds 6pcs bread
        self.queue = queue
        self.producer = producer
        self.consumer = consumer
        self.plate_size = plate_size
    
      async def produce_bread(self):
        for i in range(self.plate_size):
          bread = f"bread {i}"
          await asyncio.sleep(0.5) # bread makes faster, 0.5s/pc
          await self.queue.put(bread)
          print(f'{self.producer} makes {bread}')
    
      async def consume_bread(self):
        while True:
          bread = await self.queue.get()
          await asyncio.sleep(1) # eat slower, 1s/pc
          print(f'{self.consumer} eats {bread}')
          self.queue.task_done()
    
    async def main():
      queue = asyncio.Queue()
      cp1 = ConsumerProducerModel("John", "Grace", queue) # group 1
      cp2 = ConsumerProducerModel("Mike", "Lucy", queue) # group 2
    
      producer_1 = cp1.produce_bread()
      producer_2 = cp2.produce_bread()
    
      consumer_1 = asyncio.ensure_future(cp1.consume_bread())
      consumer_2 = asyncio.ensure_future(cp2.consume_bread())
    
      await asyncio.gather(*[producer_1, producer_2])
      await queue.join()
      consumer_1.cancel()
      consumer_2.cancel()
    
    if __name__ == '__main__':
      loop = asyncio.get_event_loop()
      loop.run_until_complete(main())
      loop.close()
    생산 소비자 모델은 다중 스레드와 대기열을 사용하여 실현할 수 있다. 여기서 협동을 선택한 것은 성능이 좋기 때문일 뿐만 아니라 전체적으로 논리가 명확하기 때문이다.
    1. 초기화된 것을 먼저 정의하고 대열이 있어야 하며 생산자가 있어야 하고 소비자가 있어야 하며 빵이 담긴 접시 크기가 있어야 한다.
    2. 생산자: 접시 크기에 따라 대응하는 물건(빵)을 생산하여 접시(queue)에 넣는다.
    3. 소비자: 접시에서 물건을 찾습니다. 물건을 찾을 때마다 하나의 임무입니다. 임무를 완성할 때마다task_done (호출 함수).이 차원에서 계속 순환한다.
    4. 주 논리: 실례화된 생산 소비자 모델 대상, 생산자 협의를 창설하고 작업(ensure_future)을 창설하며 협의 결과를 수집하고 모든 라인이 끝날 때까지 기다린다(join), 두 소비자 협의를 수동으로 취소한다.
    5. 실행: 이벤트 순환을 만들고 주 논리에 들어가서 끝날 때까지 순환을 닫습니다.
    Python Asyncio 모듈이 구현한 소비자 모델을 생산하는 방법에 관한 이 글은 여기까지 소개되었습니다. 더 많은 Python 생산 소비자 모델 내용은 저희 이전의 글을 검색하거나 아래의 관련 글을 계속 훑어보시기 바랍니다. 앞으로 많은 응원 부탁드립니다!

    좋은 웹페이지 즐겨찾기