Python Glossary English

Python 3.4+Асинхронное программированиепонятие

asyncio.Queue

очередь

Очередь для обмена данными между корутинами. put/get — с await. Не потокобезопасна: для обмена между потоками используй queue.Queue.

Синтаксис

q = asyncio.Queue(maxsize=0)
await q.put(item)
item = await q.get()

Главная боль — как остановить потребителя: await q.get() на пустой очереди ждёт вечно, а проверка q.empty() в цикле — гонка, продюсер мог просто ещё не успеть положить элемент. Штатные способы завершиться — послать сентинел (например, None) или отмечать обработанное через task_done() и ждать q.join(). maxsize больше нуля превращает put в точку ожидания и даёт backpressure: быстрый продюсер не убежит от медленного потребителя.

Примеры

import asyncio
async def producer(q):
    for i in range(3):
        await q.put(i)
async def consumer(q):
    while not q.empty():
        v = await q.get()
        print(v)  # → 0 / 1 / 2
async def main():
    q = asyncio.Queue()
    await producer(q)
    await consumer(q)
asyncio.run(main())

См. также

Открыть в полном глоссарииdocs.python.orgСообщить о неточности