Python Asyncio 모듈이 구현한 소비자 모델 생산 방법
2956 단어 PythonAsyncio 모듈생산 소비자 모델
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 생산 소비자 모델 내용은 저희 이전의 글을 검색하거나 아래의 관련 글을 계속 훑어보시기 바랍니다. 앞으로 많은 응원 부탁드립니다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Python의 None과 NULL의 차이점 상세 정보그래서 대상 = 속성 + 방법 (사실 방법도 하나의 속성, 데이터 속성과 구별되는 호출 가능한 속성 같은 속성과 방법을 가진 대상을 클래스, 즉 Classl로 분류할 수 있다.클래스는 하나의 청사진과 같아서 하나의 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.