


Для очереди «первым пришёл, первым обработан» в Python удобно добавлять задачи справа через append(), а забирать слева через popleft(). Контейнер collections.deque поддерживает операции с обоих концов. Ограничение maxlen подходит для последних событий, но опасно для задач, которые нельзя терять.
Представим последовательную обработку трёх учебных заданий. Никаких потоков в этом примере нет: один участок программы добавляет элементы, затем один обработчик забирает их.
from collections import deque
tasks = deque(["read", "check"])
tasks.append("report")
processed = []
while tasks:
processed.append(tasks.popleft())
print(processed) # ['read', 'check', 'report']
print(len(tasks)) # 0
Если заменить popleft() на pop(), последним добавленный элемент будет обработан первым. Это уже поведение стека. Название метода здесь выражает правило обработки, поэтому его полезно проверять отдельным тестом, а не только смотреть на итоговую длину контейнера.
У ограниченной очереди добавление справа при заполнении вытесняет самый левый элемент. Ошибка при этом не возникает. Для журнала последних событий это ожидаемое поведение.
recent = deque(["opened", "validated"], maxlen=2)
recent.append("saved")
print(list(recent)) # ['validated', 'saved']
Событие opened больше не хранится. Если это была необработанная задача, программа потеряла бы её молча. Поэтому рабочей очереди без допустимых потерь не задают maxlen просто ради ограничения памяти: сначала определяют, что делать при переполнении. Правило вытеснения относится к добавлению с концов; попытка insert() увеличить уже полную ограниченную очередь вызывает IndexError.
Удаление первого элемента списка через pop(0) сдвигает оставшиеся элементы. У deque добавление и удаление с концов имеют приблизительно постоянную стоимость. Это основание выбрать подходящую структуру, но не обещание конкретного ускорения без измерения вашей нагрузки.
Для частого чтения произвольных позиций список обычно естественнее. Deque не следует превращать в замену всем спискам. Также проверка if tasks и последующее извлечение не образуют единую защищённую операцию между несколькими потребителями. Для конкурентной обработки нужна отдельно продуманная синхронизация.
popleft() вызывает IndexError.На Mentoring.digital можно подобрать курс Python с практикой структур данных. Если очередь уже используется в вашем проекте, наставник по Python поможет разобрать порядок обработки и условия потери задач на вашем примере.