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Сообщить о неточности