Документация Python неофициальный перевод

queue.md

117 строк · 12.5 КБ · обычная страница · сырой текст · скачать

1> **Источник:** https://python-all.ru/3.2/library/queue.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 7.8. [`очередь`](https://python-all.ru/3.2/library/queue.html#module-queue) – синхронизированный класс очереди89**Исходный код:** [Lib/queue.py](https://python-all.ru/src/3.2/Lib/queue.py)1011---1213Модуль [`queue`](https://python-all.ru/3.2/library/queue.html#module-queue) реализует очереди с несколькими производителями и потребителями. Он особенно полезен в многопоточном программировании, когда необходимо безопасно обмениваться данными между несколькими потоками. Класс [`Queue`](https://python-all.ru/3.2/library/queue.html#queue.Queue) в этом модуле реализует всю необходимую семантику блокировок. Для работы требуется поддержка потоков в Python; см. модуль [`threading`](https://python-all.ru/3.2/library/threading.html#module-threading).1415Модуль реализует три типа очередей, которые различаются только порядком извлечения элементов. В очереди FIFO первыми извлекаются задачи, добавленные первыми. В очереди LIFO последний добавленный элемент извлекается первым (работает как стек). В очереди с приоритетом элементы поддерживаются отсортированными (с помощью модуля [`heapq`](https://python-all.ru/3.2/library/heapq.html#module-heapq)), и первым извлекается элемент с наименьшим значением.1617Модуль [`queue`](https://python-all.ru/3.2/library/queue.html#module-queue) определяет следующие классы и исключения:1819#### `class queue.Queue(maxsize=0)`2021Конструктор очереди FIFO. *maxsize* – целое число, которое задает верхнюю границу количества элементов, которые можно поместить в очередь. Вставка будет блокироваться, как только этот размер достигнут, пока элементы очереди не будут потреблены. Если *maxsize* меньше или равно нулю, размер очереди бесконечен.2223#### `class queue.LifoQueue(maxsize=0)`2425Конструктор очереди LIFO. *maxsize* – целое число, которое задает верхнюю границу количества элементов, которые можно поместить в очередь. Вставка будет блокироваться, как только этот размер достигнут, пока элементы очереди не будут потреблены. Если *maxsize* меньше или равно нулю, размер очереди бесконечен.2627#### `class queue.PriorityQueue(maxsize=0)`2829Конструктор для очереди с приоритетом. *maxsize* – целое число, задающее верхний предел количества элементов, которые можно поместить в очередь. Вставка будет блокироваться, когда этот размер достигнут, пока элементы очереди не будут потреблены. Если *maxsize* меньше или равно нулю, размер очереди бесконечен.3031Элементы с наименьшим значением извлекаются первыми (элемент с наименьшим значением – это то, что возвращает `sorted(list(entries))[0]`). Типичный шаблон для элементов – кортеж вида: `(priority_number, data)`.3233#### `exception queue.Empty`3435Исключение возникает при вызове неблокирующего `get()` (или `get_nowait()`) для пустого объекта [`очереди`](https://python-all.ru/3.2/library/queue.html#queue.Queue).3637#### `exception queue.Full`3839Исключение возникает при вызове неблокирующего `put()` (или `put_nowait()`) для полного объекта [`очереди`](https://python-all.ru/3.2/library/queue.html#queue.Queue).4041## 7.8.1. Объекты очереди4243Объекты очереди ([`Queue`](https://python-all.ru/3.2/library/queue.html#queue.Queue), [`LifoQueue`](https://python-all.ru/3.2/library/queue.html#queue.LifoQueue) или [`PriorityQueue`](https://python-all.ru/3.2/library/queue.html#queue.PriorityQueue)) предоставляют описанные ниже публичные методы.4445#### `Queue.qsize()`4647Возвращает приблизительный размер очереди. Обратите внимание: qsize() \> 0 не гарантирует, что последующий вызов get() не заблокируется, равно как qsize() \< maxsize не гарантирует, что put() не заблокируется.4849#### `Queue.empty()`5051Возвращает `True`, если очередь пуста, и `False` в противном случае. Если empty() возвращает `True`, это не гарантирует, что последующий вызов put() не будет блокироваться. Аналогично, если empty() возвращает `False`, это не гарантирует, что последующий вызов get() не будет блокироваться.5253#### `Queue.full()`5455Возвращает `True`, если очередь полна, и `False` в противном случае. Если full() возвращает `True`, это не гарантирует, что последующий вызов get() не будет блокироваться. Аналогично, если full() возвращает `False`, это не гарантирует, что последующий вызов put() не будет блокироваться.5657#### `Queue.put(item, block=True, timeout=None)`5859Помещает *item* в очередь. Если необязательный аргумент *block* равен true, а *timeout* равен None (значение по умолчанию), при необходимости блокируется до появления свободного места. Если *timeout* – положительное число, блокируется не более чем на *timeout* секунд и возбуждает исключение [`Full`](https://python-all.ru/3.2/library/queue.html#queue.Full), если свободное место не появилось за это время. В противном случае (*block* равен false) помещает элемент в очередь, если свободное место есть немедленно; иначе возбуждает исключение [`Full`](https://python-all.ru/3.2/library/queue.html#queue.Full) (в этом случае *timeout* игнорируется).6061#### `Queue.put_nowait(item)`6263Эквивалентно `put(item, False)`.6465#### `Queue.get(block=True, timeout=None)`6667Удаляет и возвращает элемент из очереди. Если необязательный аргумент *block* равен true и *timeout* равен None (по умолчанию), при необходимости блокируется до появления элемента. Если *timeout* – положительное число, он блокируется не более чем на *timeout* секунд и возбуждает исключение [`Empty`](https://python-all.ru/3.2/library/queue.html#queue.Empty), если за это время элемент не появился. В противном случае (*block* равен false) возвращает элемент, если он доступен немедленно; иначе возбуждает исключение [`Empty`](https://python-all.ru/3.2/library/queue.html#queue.Empty) (в этом случае *timeout* игнорируется).6869#### `Queue.get_nowait()`7071Эквивалентно `get(False)`.7273Предлагаются два метода для отслеживания того, были ли задачи, поставленные в очередь, полностью обработаны потоками-потребителями-демонами.7475#### `Queue.task_done()`7677Указывает, что ранее поставленная задача выполнена. Используется потоками-потребителями очереди. Для каждого [`get()`](https://python-all.ru/3.2/library/queue.html#queue.Queue.get), используемого для получения задачи, последующий вызов [`task_done()`](https://python-all.ru/3.2/library/queue.html#queue.Queue.task_done) сообщает очереди, что обработка задачи завершена.7879Если [`join()`](https://python-all.ru/3.2/library/queue.html#queue.Queue.join) в данный момент блокируется, он возобновит работу, когда все элементы будут обработаны (то есть вызов [`task_done()`](https://python-all.ru/3.2/library/queue.html#queue.Queue.task_done) был получен для каждого элемента, который был помещён в очередь с помощью [`put()`](https://python-all.ru/3.2/library/queue.html#queue.Queue.put)).8081Возбуждает [`ValueError`](https://python-all.ru/3.2/library/exceptions.html#ValueError), если вызывается больше раз, чем было помещено элементов в очередь.8283#### `Queue.join()`8485Блокируется до тех пор, пока все элементы в очереди не будут получены и обработаны.8687Счётчик незавершённых задач увеличивается каждый раз, когда элемент добавляется в очередь. Счётчик уменьшается каждый раз, когда поток-потребитель вызывает [`task_done()`](https://python-all.ru/3.2/library/queue.html#queue.Queue.task_done), чтобы указать, что элемент извлечён и вся работа над ним завершена. Когда счётчик незавершённых задач падает до нуля, [`join()`](https://python-all.ru/3.2/library/queue.html#queue.Queue.join) разблокируется.8889Пример ожидания завершения поставленных в очередь задач:9091```python92def worker():93    while True:94        item = q.get()95        do_work(item)96        q.task_done()9798q = Queue()99for i in range(num_worker_threads):100     t = Thread(target=worker)101     t.daemon = True102     t.start()103104for item in source():105    q.put(item)106107q.join()       # ожидать завершения всех задач108```109110> **См. также**111>112> **Класс [`multiprocessing.Queue`](https://python-all.ru/3.2/library/multiprocessing.html#multiprocessing.Queue)**113>114> Класс очереди для использования в контексте многопроцессорной обработки (а не многопоточности).115>116> [`collections.deque`](https://python-all.ru/3.2/library/collections.html#collections.deque) – альтернативная реализация неограниченных очередей с быстрыми атомарными операциями `append()` и `popleft()`, не требующими блокировки.117