Hardasyncio

Что такое asyncio.Queue?

1Постановка

Разберём, что от вас хотят в этом вопросе и как к нему подступиться на собеседовании.

2Решение

asyncio.Queue — async FIFO очередь для producer-consumer в asyncio. put() блокирует корутину (не thread) если очередь полна — другие корутины могут работать.

import asyncio

async def producer(q):
    for i in range(10):
        await q.put(i)
        await asyncio.sleep(0.1)
    await q.put(None)   # сигнал завершения

async def consumer(q):
    while True:
        item = await q.get()
        if item is None:
            break
        await process(item)
        q.task_done()

async def main():
    q = asyncio.Queue(maxsize=10)
    await asyncio.gather(producer(q), consumer(q))
    await q.join()   # ждать пока все items обработаны

asyncio.run(main())
  • put_nowait/get_nowait — бросают QueueEmpty/QueueFull;
  • PriorityQueue, LifoQueue — варианты;
  • Для координации корутин в одном event loop, не между процессами;
  • Для cross-thread/cross-process — queue.Queue (threading) или multiprocessing.Queue.

3Как отвечать

  • Сначала уточните условия и ограничения, покажите аналитическое мышление.
  • Рассуждайте вслух — интервьюеру важен ход мысли, а не только финальный ответ.
  • Оцените сложность по времени и памяти (Big-O), если это алгоритмический вопрос.
💡

На реальном собеседовании Alffert подскажет развёрнутый ответ в реальном времени.