queue.md
1> **Источник:** https://python-all.ru/2.7/library/queue.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 8.10. [`Queue`](https://python-all.ru/2.7/library/queue.html#module-Queue) – синхронизированный класс очереди89> **Примечание**10>11> Модуль [`Queue`](https://python-all.ru/2.7/library/queue.html#module-Queue) был переименован в `queue` в Python 3. Инструмент [2to3](https://python-all.ru/2.7/glossary.html#term-2to3) автоматически адаптирует импорты при преобразовании исходных кодов в Python 3.1213**Исходный код:** [Lib/Queue.py](https://python-all.ru/src/2.7/Lib/Queue.py)1415---1617Модуль [`Queue`](https://python-all.ru/2.7/library/queue.html#module-Queue) реализует очереди с несколькими производителями и потребителями. Он особенно полезен в многопоточном программировании, когда необходимо безопасно обмениваться данными между несколькими потоками. Класс [`Queue`](https://python-all.ru/2.7/library/queue.html#Queue.Queue) в этом модуле реализует всю необходимую семантику блокировок. Он зависит от наличия поддержки потоков в Python; см. модуль [`threading`](https://python-all.ru/2.7/library/threading.html#module-threading).1819Модуль реализует три типа очередей, которые различаются только порядком, в котором элементы извлекаются. В очереди FIFO первые добавленные задачи извлекаются первыми. В очереди LIFO последний добавленный элемент извлекается первым (работает как стек). В очереди с приоритетом элементы хранятся отсортированными (с использованием модуля [`heapq`](https://python-all.ru/2.7/library/heapq.html#module-heapq)), и элемент с наименьшим значением извлекается первым.2021Модуль [`Queue`](https://python-all.ru/2.7/library/queue.html#module-Queue) определяет следующие классы и исключения:2223#### `class Queue.Queue(maxsize=0)`2425Конструктор очереди FIFO. *maxsize* – целое число, которое задает верхнюю границу количества элементов, которые можно поместить в очередь. Вставка будет блокироваться, как только этот размер достигнут, пока элементы очереди не будут потреблены. Если *maxsize* меньше или равно нулю, размер очереди бесконечен.2627#### `class Queue.LifoQueue(maxsize=0)`2829Конструктор очереди LIFO. *maxsize* – целое число, которое задает верхнюю границу количества элементов, которые можно поместить в очередь. Вставка будет блокироваться, как только этот размер достигнут, пока элементы очереди не будут потреблены. Если *maxsize* меньше или равно нулю, размер очереди бесконечен.3031Новое в версии 2.6.3233#### `class Queue.PriorityQueue(maxsize=0)`3435Конструктор для очереди с приоритетом. *maxsize* – целое число, задающее верхний предел количества элементов, которые можно поместить в очередь. Вставка будет блокироваться, когда этот размер достигнут, пока элементы очереди не будут потреблены. Если *maxsize* меньше или равно нулю, размер очереди бесконечен.3637Элементы с наименьшим значением извлекаются первыми (элемент с наименьшим значением – это тот, который возвращается `sorted(list(entries))[0]`). Типичный шаблон для элементов – кортеж вида: `(priority_number, data)`.3839Новое в версии 2.6.4041#### `exception Queue.Empty`4243Исключение, возбуждаемое при вызове неблокирующего [`get()`](https://python-all.ru/2.7/library/queue.html#Queue.Queue.get) (или [`get_nowait()`](https://python-all.ru/2.7/library/queue.html#Queue.Queue.get_nowait)) на пустом объекте [`Queue`](https://python-all.ru/2.7/library/queue.html#Queue.Queue).4445#### `exception Queue.Full`4647Исключение, возбуждаемое при вызове неблокирующего [`put()`](https://python-all.ru/2.7/library/queue.html#Queue.Queue.put) (или [`put_nowait()`](https://python-all.ru/2.7/library/queue.html#Queue.Queue.put_nowait)) на полном объекте [`Queue`](https://python-all.ru/2.7/library/queue.html#Queue.Queue).4849> **См. также**50>51> [`collections.deque`](https://python-all.ru/2.7/library/collections.html#collections.deque) – альтернативная реализация неограниченных очередей с быстрыми атомарными операциями `append()` и `popleft()`, не требующими блокировки.5253## 8.10.1. Объекты очереди5455Объекты очередей ([`Queue`](https://python-all.ru/2.7/library/queue.html#Queue.Queue), [`LifoQueue`](https://python-all.ru/2.7/library/queue.html#Queue.LifoQueue) или [`PriorityQueue`](https://python-all.ru/2.7/library/queue.html#Queue.PriorityQueue)) предоставляют описанные ниже открытые методы.5657#### `Queue.qsize()`5859Возвращает приблизительный размер очереди. Обратите внимание: qsize() \> 0 не гарантирует, что последующий вызов get() не заблокируется, равно как qsize() \< maxsize не гарантирует, что put() не заблокируется.6061#### `Queue.empty()`6263Возвращает `True`, если очередь пуста, и `False` в противном случае. Если empty() возвращает `True`, это не гарантирует, что последующий вызов put() не заблокируется. Аналогично, если empty() возвращает `False`, это не гарантирует, что последующий вызов get() не заблокируется.6465#### `Queue.full()`6667Возвращает `True`, если очередь заполнена, и `False` в противном случае. Если full() возвращает `True`, это не гарантирует, что последующий вызов get() не заблокируется. Аналогично, если full() возвращает `False`, это не гарантирует, что последующий вызов put() не заблокируется.6869#### `Queue.put(item[, block[, timeout]])`7071Помещает *item* в очередь. Если необязательный аргумент *block* равен true, а *timeout* равен `None` (по умолчанию), блокирует при необходимости до появления свободного места. Если *timeout* – положительное число, блокирует не более *timeout* секунд и вызывает исключение [`Full`](https://python-all.ru/2.7/library/queue.html#Queue.Full), если за это время свободное место не появилось. В противном случае (*block* равен false), помещает элемент в очередь, если свободное место доступно немедленно, иначе вызывает исключение [`Full`](https://python-all.ru/2.7/library/queue.html#Queue.Full) (*timeout* в этом случае игнорируется).7273Новое в версии 2.3: Параметр *timeout*.7475#### `Queue.put_nowait(item)`7677Эквивалентно `put(item, False)`.7879#### `Queue.get([block[, timeout]])`8081Удаляет и возвращает элемент из очереди. Если необязательный аргумент *block* равен true, а *timeout* равен `None` (по умолчанию), блокирует при необходимости до появления элемента. Если *timeout* – положительное число, блокирует не более *timeout* секунд и вызывает исключение [`Empty`](https://python-all.ru/2.7/library/queue.html#Queue.Empty), если за это время элемент не появился. В противном случае (*block* равен false), возвращает элемент, если он доступен немедленно, иначе вызывает исключение [`Empty`](https://python-all.ru/2.7/library/queue.html#Queue.Empty) (*timeout* в этом случае игнорируется).8283Новое в версии 2.3: Параметр *timeout*.8485#### `Queue.get_nowait()`8687Эквивалентно `get(False)`.8889Предлагаются два метода для отслеживания того, были ли задачи, поставленные в очередь, полностью обработаны потоками-потребителями-демонами.9091#### `Queue.task_done()`9293Указывает, что ранее поставленная в очередь задача завершена. Используется потоками-потребителями очереди. Для каждого вызова [`get()`](https://python-all.ru/2.7/library/queue.html#Queue.Queue.get), использованного для получения задачи, последующий вызов [`task_done()`](https://python-all.ru/2.7/library/queue.html#Queue.Queue.task_done) сообщает очереди, что обработка задачи завершена.9495Если [`join()`](https://python-all.ru/2.7/library/queue.html#Queue.Queue.join) в данный момент заблокирован, он возобновит работу, когда все элементы будут обработаны (то есть для каждого элемента, который был [`put()`](https://python-all.ru/2.7/library/queue.html#Queue.Queue.put) в очередь, был получен вызов [`task_done()`](https://python-all.ru/2.7/library/queue.html#Queue.Queue.task_done)).9697Возбуждает [`ValueError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.ValueError), если вызывается больше раз, чем было помещено элементов в очередь.9899Новое в версии 2.5.100101#### `Queue.join()`102103Блокируется до тех пор, пока все элементы в очереди не будут получены и обработаны.104105Счётчик незавершённых задач увеличивается при добавлении элемента в очередь. Счётчик уменьшается, когда поток-потребитель вызывает [`task_done()`](https://python-all.ru/2.7/library/queue.html#Queue.Queue.task_done), указывая, что элемент получен и вся работа над ним завершена. Когда счётчик незавершённых задач падает до нуля, [`join()`](https://python-all.ru/2.7/library/queue.html#Queue.Queue.join) разблокируется.106107Новое в версии 2.5.108109Пример ожидания завершения поставленных в очередь задач:110111```python112def worker():113 while True:114 item = q.get()115 do_work(item)116 q.task_done()117118q = Queue()119for i in range(num_worker_threads):120 t = Thread(target=worker)121 t.daemon = True122 t.start()123124for item in source():125 q.put(item)126127q.join() # ожидать завершения всех задач128```129