Что такое очередь и ее основные принципы работы
Что проверяют
Знаете ли вы FIFO и, главное, умеете ли выбрать реализацию под задачу. В Python вопрос почти всегда сводится к тому, чем очередь отличается от списка и какую из стандартных очередей брать: collections.deque, queue.Queue, asyncio.Queue или multiprocessing.Queue.
Как отвечать
Очередь это структура с дисциплиной доступа FIFO: добавление в хвост (enqueue), извлечение из головы (dequeue), плюс проверка пустоты и размер. Стек в противоположность ей работает по LIFO.
Реализация очереди на списке через pop(0) неверна: удаление из начала сдвигает все элементы и стоит O(n). Рабочий вариант это collections.deque, у которого append и popleft амортизированно O(1).
from collections import deque
q = deque()
q.append(1)
q.append(2)
first = q.popleft() # 1Если нужна потокобезопасность, берут queue.Queue: внутри тот же deque плюс блокировки и условные переменные, get ждёт появления элемента, а task_done и join закрывают паттерн пула воркеров. Для корутин есть asyncio.Queue с тем же интерфейсом, но с await вместо блокировки потока. Между процессами работает multiprocessing.Queue, где элементы проходят через pickle и канал, поэтому класть туда можно только сериализуемое.
Полезно назвать и соседей: deque(maxlen=N) для окна последних событий и heapq, когда важен не порядок поступления, а приоритет.
Где спотыкаются
Говорят, что очередь это просто список, и показывают pop(0). Это ловят сразу: попросят оценить сложность и поведение на миллионе элементов.
Берут queue.Queue в асинхронном коде. Её get блокирует поток целиком и вешает цикл событий; в корутинах нужна asyncio.Queue, а синхронный источник выносят в исполнителя.
Полагаются на empty() и qsize() при конкурентном доступе. Оба возвращают мгновенный снимок, который к следующей строке уже неверен. Правильно ловить исключение Empty или использовать get с таймаутом.