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

queue.md

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

1> **Источник:** https://python-all.ru/3.0/library/queue.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# `queue` – синхронизированный класс очереди89Модуль `очередь` реализует очереди с множеством производителей и потребителей. Особенно полезен в многопоточном программировании, когда необходимо безопасно обмениваться данными между несколькими потоками. Класс [`Queue`](https://python-all.ru/3.0/library/queue.html#queue.Queue) в этом модуле реализует всю необходимую семантику блокировок. Он зависит от наличия поддержки потоков в Python; см. модуль [`threading`](https://python-all.ru/3.0/library/threading.html#module-threading).1011Реализует три типа очередей, различающихся только порядком извлечения элементов. В очереди FIFO первыми добавляются первые задачи, они же извлекаются первыми. В очереди LIFO последний добавленный элемент извлекается первым (работает как стек). В очереди с приоритетом элементы хранятся отсортированными (с использованием модуля [`heapq`](https://python-all.ru/3.0/library/heapq.html#module-heapq)) и извлекается элемент с наименьшим значением.1213Модуль `очередь` определяет следующие классы и исключения:1415#### `[queue.Queue]class queue.Queue(maxsize)`1617Конструктор очереди FIFO.1819*maxsize*2021– целое число, которое задает верхнюю границу количества элементов, которые можно поместить в очередь. Вставка будет блокироваться, как только этот размер достигнут, пока элементы очереди не будут потреблены. Если2223*maxsize*2425меньше или равно нулю, размер очереди бесконечен.2627#### `[queue.LifoQueue]class queue.LifoQueue(maxsize)`2829Конструктор очереди LIFO.3031*maxsize*3233– целое число, которое задает верхнюю границу количества элементов, которые можно поместить в очередь. Вставка будет блокироваться, как только этот размер достигнут, пока элементы очереди не будут потреблены. Если3435*maxsize*3637меньше или равно нулю, размер очереди бесконечен.3839#### `[queue.PriorityQueue]class queue.PriorityQueue(maxsize)`4041Конструктор для очереди с приоритетом. *maxsize* – целое число, задающее верхний предел количества элементов, которые можно поместить в очередь. Вставка будет блокироваться, когда этот размер достигнут, пока элементы очереди не будут потреблены. Если *maxsize* меньше или равно нулю, размер очереди бесконечен.4243Элементы с наименьшим значением извлекаются первыми (элемент с наименьшим значением – это то, что возвращает `sorted(list(entries))[0]`). Типичный шаблон для элементов – кортеж вида: `(priority_number, data)`.4445#### `[queue.Empty]exception queue.Empty`4647Исключение возникает при вызове неблокирующего4849`get()`5051(или5253`get_nowait()`5455) для пустого объекта5657[`очереди`](https://python-all.ru/3.0/library/queue.html#queue.Queue)5859.6061#### `[queue.Full]exception queue.Full`6263Исключение возникает при вызове неблокирующего6465`put()`6667(или6869`put_nowait()`7071) для полного объекта7273[`очереди`](https://python-all.ru/3.0/library/queue.html#queue.Queue)7475.7677## Объекты очередей7879Объекты очереди ([`Queue`](https://python-all.ru/3.0/library/queue.html#queue.Queue), [`LifoQueue`](https://python-all.ru/3.0/library/queue.html#queue.LifoQueue) или [`PriorityQueue`](https://python-all.ru/3.0/library/queue.html#queue.PriorityQueue)) предоставляют описанные ниже публичные методы.8081#### `[queue.Queue.qsize]Queue.qsize()`8283Возвращает приблизительный размер очереди. Обратите внимание: qsize() \> 0 не гарантирует, что последующий вызов get() не заблокируется, равно как qsize() \< maxsize не гарантирует, что put() не заблокируется.8485#### `[queue.Queue.put]Queue.put(item[, block[, timeout]])`8687Помещает8889*item*9091в очередь. Если необязательный аргумент9293*block*9495равен true, а9697*timeout*9899равен None (значение по умолчанию), при необходимости блокируется до появления свободного места. Если100101*timeout*102103– положительное число, блокируется не более чем на104105*timeout*106107секунд и возбуждает исключение108109[`Full`](https://python-all.ru/3.0/library/queue.html#queue.Full)110111, если свободное место не появилось за это время. В противном случае (112113*block*114115равен false) помещает элемент в очередь, если свободное место есть немедленно; иначе возбуждает исключение116117[`Full`](https://python-all.ru/3.0/library/queue.html#queue.Full)118119(в этом случае120121*timeout*122123игнорируется).124125#### `[queue.Queue.put_nowait]Queue.put_nowait(item)`126127Эквивалентно128129`put(item, False)`130131.132133#### `[queue.Queue.get]Queue.get([block[, timeout]])`134135Удаляет и возвращает элемент из очереди. Если необязательный аргумент136137*block*138139равен true и140141*timeout*142143равен None (по умолчанию), при необходимости блокируется до появления элемента. Если144145*timeout*146147– положительное число, он блокируется не более чем на148149*timeout*150151секунд и возбуждает исключение152153[`Empty`](https://python-all.ru/3.0/library/queue.html#queue.Empty)154155, если за это время элемент не появился. В противном случае (156157*block*158159равен false) возвращает элемент, если он доступен немедленно; иначе возбуждает исключение160161[`Empty`](https://python-all.ru/3.0/library/queue.html#queue.Empty)162163(в этом случае164165*timeout*166167игнорируется).168169#### `[queue.Queue.get_nowait]Queue.get_nowait()`170171Эквивалентно172173`get(False)`174175.176177Предлагаются два метода для отслеживания того, были ли задачи, поставленные в очередь, полностью обработаны потоками-потребителями-демонами.178179#### `[queue.Queue.task_done]Queue.task_done()`180181Указывает, что ранее поставленная задача выполнена. Используется потоками-потребителями очереди. Для каждого [`get()`](https://python-all.ru/3.0/library/queue.html#queue.Queue.get), используемого для получения задачи, последующий вызов [`task_done()`](https://python-all.ru/3.0/library/queue.html#queue.Queue.task_done) сообщает очереди, что обработка задачи завершена.182183Если [`join()`](https://python-all.ru/3.0/library/queue.html#queue.Queue.join) в данный момент блокируется, он возобновит работу, когда все элементы будут обработаны (то есть вызов [`task_done()`](https://python-all.ru/3.0/library/queue.html#queue.Queue.task_done) был получен для каждого элемента, который был помещён в очередь с помощью [`put()`](https://python-all.ru/3.0/library/queue.html#queue.Queue.put)).184185Возбуждает [`ValueError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.ValueError), если вызывается больше раз, чем было помещено элементов в очередь.186187#### `[queue.Queue.join]Queue.join()`188189Блокируется до тех пор, пока все элементы в очереди не будут получены и обработаны.190191Счётчик незавершённых задач увеличивается всякий раз, когда элемент добавляется в очередь. Счётчик уменьшается, когда поток-потребитель вызывает [`task_done()`](https://python-all.ru/3.0/library/queue.html#queue.Queue.task_done), чтобы сообщить, что элемент был извлечён и вся работа над ним завершена. Когда счётчик незавершённых задач падает до нуля, join() разблокируется.192193Пример ожидания завершения поставленных в очередь задач:194195```python196def worker():197    while True:198        item = q.get()199        do_work(item)200        q.task_done()201202q = Queue()203for i in range(num_worker_threads):204     t = Thread(target=worker)205     t.set_daemon(True)206     t.start()207208for item in source():209    q.put(item)210211q.join()       # ожидать завершения всех задач212```213