queue.md
1> **Источник:** https://python-all.ru/3.5/library/queue.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 17.7. [`queue`](https://python-all.ru/3.5/library/queue.html#module-queue) – синхронизированный класс очереди89**Исходный код:** [Lib/queue.py](https://python-all.ru/src/3.5/Lib/queue.py)1011---1213Модуль [`queue`](https://python-all.ru/3.5/library/queue.html#module-queue) реализует очереди с несколькими производителями и потребителями. Он особенно полезен в многопоточном программировании, когда необходимо безопасно обмениваться данными между несколькими потоками. Класс [`Queue`](https://python-all.ru/3.5/library/queue.html#queue.Queue) в этом модуле реализует всю необходимую семантику блокировок. Он зависит от наличия поддержки потоков в Python; см. модуль [`threading`](https://python-all.ru/3.5/library/threading.html#module-threading).1415Модуль реализует три типа очередей, которые различаются только порядком, в котором элементы извлекаются. В очереди FIFO первые добавленные задачи извлекаются первыми. В очереди LIFO последний добавленный элемент извлекается первым (работает как стек). В очереди с приоритетом элементы хранятся отсортированными (с использованием модуля [`heapq`](https://python-all.ru/3.5/library/heapq.html#module-heapq)), и элемент с наименьшим значением извлекается первым.1617Внутренне модуль использует блокировки для временной блокировки конкурирующих потоков; однако он не предназначен для обработки реентерабельности в пределах одного потока.1819Модуль [`queue`](https://python-all.ru/3.5/library/queue.html#module-queue) определяет следующие классы и исключения:2021#### `class queue.Queue(maxsize=0)`2223Конструктор очереди FIFO. *maxsize* – целое число, которое задает верхнюю границу количества элементов, которые можно поместить в очередь. Вставка будет блокироваться, как только этот размер достигнут, пока элементы очереди не будут потреблены. Если *maxsize* меньше или равно нулю, размер очереди бесконечен.2425#### `class queue.LifoQueue(maxsize=0)`2627Конструктор очереди LIFO. *maxsize* – целое число, которое задает верхнюю границу количества элементов, которые можно поместить в очередь. Вставка будет блокироваться, как только этот размер достигнут, пока элементы очереди не будут потреблены. Если *maxsize* меньше или равно нулю, размер очереди бесконечен.2829#### `class queue.PriorityQueue(maxsize=0)`3031Конструктор для очереди с приоритетом. *maxsize* – целое число, задающее верхний предел количества элементов, которые можно поместить в очередь. Вставка будет блокироваться, когда этот размер достигнут, пока элементы очереди не будут потреблены. Если *maxsize* меньше или равно нулю, размер очереди бесконечен.3233Элементы с наименьшим значением извлекаются первыми (элемент с наименьшим значением – это тот, который возвращается `sorted(list(entries))[0]`). Типичный шаблон для элементов – кортеж вида: `(priority_number, data)`.3435#### `exception queue.Empty`3637Исключение, возбуждаемое при вызове неблокирующего [`get()`](https://python-all.ru/3.5/library/queue.html#queue.Queue.get) (или [`get_nowait()`](https://python-all.ru/3.5/library/queue.html#queue.Queue.get_nowait)) на пустом объекте [`Queue`](https://python-all.ru/3.5/library/queue.html#queue.Queue).3839#### `exception queue.Full`4041Исключение, возбуждаемое при вызове неблокирующего [`put()`](https://python-all.ru/3.5/library/queue.html#queue.Queue.put) (или [`put_nowait()`](https://python-all.ru/3.5/library/queue.html#queue.Queue.put_nowait)) на полном объекте [`Queue`](https://python-all.ru/3.5/library/queue.html#queue.Queue).4243## 17.7.1. Объекты очереди4445Объекты очередей ([`Queue`](https://python-all.ru/3.5/library/queue.html#queue.Queue), [`LifoQueue`](https://python-all.ru/3.5/library/queue.html#queue.LifoQueue) или [`PriorityQueue`](https://python-all.ru/3.5/library/queue.html#queue.PriorityQueue)) предоставляют описанные ниже открытые методы.4647#### `Queue.qsize()`4849Возвращает приблизительный размер очереди. Обратите внимание: qsize() \> 0 не гарантирует, что последующий вызов get() не заблокируется, равно как qsize() \< maxsize не гарантирует, что put() не заблокируется.5051#### `Queue.empty()`5253Возвращает `True`, если очередь пуста, и `False` в противном случае. Если empty() возвращает `True`, это не гарантирует, что последующий вызов put() не заблокируется. Аналогично, если empty() возвращает `False`, это не гарантирует, что последующий вызов get() не заблокируется.5455#### `Queue.full()`5657Возвращает `True`, если очередь заполнена, и `False` в противном случае. Если full() возвращает `True`, это не гарантирует, что последующий вызов get() не заблокируется. Аналогично, если full() возвращает `False`, это не гарантирует, что последующий вызов put() не заблокируется.5859#### `Queue.put(item, block=True, timeout=None)`6061Помещает *item* в очередь. Если необязательный аргумент *block* равен true, а *timeout* равен `None` (по умолчанию), блокирует при необходимости до появления свободного места. Если *timeout* – положительное число, блокирует не более *timeout* секунд и вызывает исключение [`Full`](https://python-all.ru/3.5/library/queue.html#queue.Full), если за это время свободное место не появилось. В противном случае (*block* равен false), помещает элемент в очередь, если свободное место доступно немедленно, иначе вызывает исключение [`Full`](https://python-all.ru/3.5/library/queue.html#queue.Full) (*timeout* в этом случае игнорируется).6263#### `Queue.put_nowait(item)`6465Эквивалентно `put(item, False)`.6667#### `Queue.get(block=True, timeout=None)`6869Удаляет и возвращает элемент из очереди. Если необязательный аргумент *block* равен true, а *timeout* равен `None` (по умолчанию), блокирует при необходимости до появления элемента. Если *timeout* – положительное число, блокирует не более *timeout* секунд и вызывает исключение [`Empty`](https://python-all.ru/3.5/library/queue.html#queue.Empty), если за это время элемент не появился. В противном случае (*block* равен false), возвращает элемент, если он доступен немедленно, иначе вызывает исключение [`Empty`](https://python-all.ru/3.5/library/queue.html#queue.Empty) (*timeout* в этом случае игнорируется).7071#### `Queue.get_nowait()`7273Эквивалентно `get(False)`.7475Предлагаются два метода для отслеживания того, были ли задачи, поставленные в очередь, полностью обработаны потоками-потребителями-демонами.7677#### `Queue.task_done()`7879Указывает, что ранее поставленная в очередь задача завершена. Используется потоками-потребителями очереди. Для каждого вызова [`get()`](https://python-all.ru/3.5/library/queue.html#queue.Queue.get), использованного для получения задачи, последующий вызов [`task_done()`](https://python-all.ru/3.5/library/queue.html#queue.Queue.task_done) сообщает очереди, что обработка задачи завершена.8081Если [`join()`](https://python-all.ru/3.5/library/queue.html#queue.Queue.join) в данный момент заблокирован, он возобновит работу, когда все элементы будут обработаны (то есть для каждого элемента, который был [`put()`](https://python-all.ru/3.5/library/queue.html#queue.Queue.put) в очередь, был получен вызов [`task_done()`](https://python-all.ru/3.5/library/queue.html#queue.Queue.task_done)).8283Возбуждает [`ValueError`](https://python-all.ru/3.5/library/exceptions.html#ValueError), если вызывается больше раз, чем было помещено элементов в очередь.8485#### `Queue.join()`8687Блокируется до тех пор, пока все элементы в очереди не будут получены и обработаны.8889Счётчик незавершённых задач увеличивается при добавлении элемента в очередь. Счётчик уменьшается, когда поток-потребитель вызывает [`task_done()`](https://python-all.ru/3.5/library/queue.html#queue.Queue.task_done), указывая, что элемент получен и вся работа над ним завершена. Когда счётчик незавершённых задач падает до нуля, [`join()`](https://python-all.ru/3.5/library/queue.html#queue.Queue.join) разблокируется.9091Пример ожидания завершения поставленных в очередь задач:9293```python94def worker():95 while True:96 item = q.get()97 if item is None:98 break99 do_work(item)100 q.task_done()101102q = queue.Queue()103threads = []104for i in range(num_worker_threads):105 t = threading.Thread(target=worker)106 t.start()107 threads.append(t)108109for item in source():110 q.put(item)111112# ожидать завершения всех задач113q.join()114115# остановить workers116for i in range(num_worker_threads):117 q.put(None)118for t in threads:119 t.join()120```121122> **См. также**123>124> **Класс [`multiprocessing.Queue`](https://python-all.ru/3.5/library/multiprocessing.html#multiprocessing.Queue)**125>126> Класс очереди для использования в контексте многопроцессорной обработки (а не многопоточности).127>128> [`collections.deque`](https://python-all.ru/3.5/library/collections.html#collections.deque) – это альтернативная реализация неограниченных очередей с быстрыми атомарными операциями [`append()`](https://python-all.ru/3.5/library/collections.html#collections.deque.append) и [`popleft()`](https://python-all.ru/3.5/library/collections.html#collections.deque.popleft), которые не требуют блокировки.129