PYTHON · 비동기
비동기 큐
asyncio.Queue로 생산자-소비자 패턴을 비동기로 구현합니다.
비동기중급Queue큐producer-consumer비동기
핵심 설명
asyncio.Queue로 생산자-소비자 패턴을 비동기로 구현합니다.
Python code
import asyncio
import random
async def producer(queue: asyncio.Queue, name: str, count: int):
for i in range(count):
item = f"{name}-{i}"
await asyncio.sleep(random.uniform(0.1, 0.5))
await queue.put(item)
print(f" 생산: {item}")
await queue.put(None) # 종료 신호
async def consumer(queue: asyncio.Queue, name: str):
while True:
item = await queue.get()
if item is None:
queue.task_done()
break
await asyncio.sleep(random.uniform(0.1, 0.3))
print(f" 소비 [{name}]: {item}")
queue.task_done()
async def main():
queue: asyncio.Queue = asyncio.Queue(maxsize=5)
# 생산자 2개, 소비자 3개
producers = [
asyncio.create_task(producer(queue, f"P{i}", 3))
for i in range(2)
]
consumers = [
asyncio.create_task(consumer(queue, f"C{i}"))
for i in range(3)
]
await asyncio.gather(*producers)
# 남은 소비자에 종료 신호
for _ in range(len(consumers) - len(producers)):
await queue.put(None)
await asyncio.gather(*consumers)
print("모든 작업 완료")
asyncio.run(main())학습 팁
maxsize를 설정하면 큐가 가득 찰 때 생산자가 자동으로 대기하여 배압(backpressure)을 제어합니다.
주의할 점
종료 신호(sentinel)를 보내지 않으면 소비자가 영원히 대기합니다. None이나 특별한 객체를 종료 신호로 사용하세요.
자주 묻는 질문
비동기 큐란 무엇인가요?
asyncio.Queue 로 생산자-소비자 패턴을 비동기로 구현합니다.
비동기 큐 학습 시 주의할 점은 무엇인가요?
종료 신호(sentinel)를 보내지 않으면 소비자가 영원히 대기합니다. None 이나 특별한 객체를 종료 신호로 사용하세요.
Continue Learning
Python 학습을 이어가세요
총 200개의 독립 HTML 학습 문서 중 하나입니다. 각 문서는 고유 URL과 canonical 메타데이터를 가집니다.