PHpullh

PYTHON · 비동기

비동기 큐

asyncio.Queue로 생산자-소비자 패턴을 비동기로 구현합니다.

비동기중급Queueproducer-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 이나 특별한 객체를 종료 신호로 사용하세요.