Объекты очереди создаются в момент инициализации классов queue.Queue()
, queue.LifoQueue()
или queue.PriorityQueue()
и имеют открытые методы, описанные ниже.
Queue.qsize()
,True
, если очередь пуста Queue.empty()
,True
, если очередь заполнена Queue.full()
,Queue.put()
,Queue.put_nowait()
,Queue.get()
,Queue.get(False)
Queue.get_nowait()
,Queue.task_done()
,Queue.join()
,Queue.qsize()
:Метод Queue.qsize()
возвращает примерный размер очереди.
Обратите внимание, что SimpleQueue.qsize() > 0
не гарантирует, что последующий метод Queue.get()
не будет блокироваться.
Queue.empty()
:Метод Queue.empty()
возвращает True
, если очередь пуста, иначе False
.
Если SimpleQueue.empty()
возвращает False
, это не гарантирует, что последующий вызов метода Queue.get()
не будет блокирован.
Queue.full()
:Метод Queue.full()
возвращает True
, если очередь заполнена и False
в противном случае.
Queue.full()
возвращает True
, это не гарантирует, что последующий вызов Queue.get()
не будет блокирован. Queue.full()
возвращает False
, это не гарантирует, что последующий вызов Queue.put()
не будет блокирован.Queue.put(item, block=True, timeout=None)
:Метод Queue.put()
размещает элемент item
в очереди.
Если необязательный аргумент block
имеет значение True
, а время ожидания равно None
(по умолчанию), то при необходимости добавление элемента в очереди блокируется, пока не освободится свободный слот.
Если тайм-аут timeout
является положительным числом, то добавление элемента в очередь блокируется на максимальное время ожидания timeout
и если в течение этого времени не было свободного места, то выдается исключение queue.Full
. В противном случае, когда block=False
и если свободный слот сразу же доступен, то элемент item
добавляется в очередь, иначе вызывается исключение queue.Full
. В этом случае аргумент тайм-аут timeout
игнорируется.
Queue.put_nowait(item)
:Метод Queue.put_nowait()
эквивалентен вызову метода Queue.put(item, False)
с указанными параметрами.
Queue.get(block=True, timeout=None)
:Метод Queue.get()
возвращает, а затем удаляет элемент из очереди.
Если необязательный аргумент block
имеет значение True
, а время ожидания timeout=None
(по умолчанию), то при необходимости происходит блокировка, на время пока элемент не станет доступен.
Если тайм-аут timeout
является положительным числом, то извлечение элемента из очереди блокируется на максимальное время ожидания timeout
и если в течение этого времени ни один элемент не был доступен, то вызывается исключение queue.Empty
. В противном случае, когда block=False
и если элемент сразу доступен, то элемент возвращается, иначе вызывается исключение queue.Empty
,в этом случае timeout
игнорируется.
Для всех версий в Windows, если block=True
и время ожидания timeout=None
, то эта операция переходит в непрерывное ожидание базовой блокировки. Это означает, что исключений может не быть, и в частности, SIGINT
не будет вызывать KeyboardInterrupt
.
Queue.get_nowait()
:Метод Queue.get_nowait()
эквивалентен вызову метода Queue.get(False)
.
Для поддержки отслеживания того, были ли поставленные в очередь задачи полностью обработаны потоками-потребителями демонов, объекты очереди предлагают два метода.
Queue.task_done()
:Метод Queue.task_done()
указывает, что ранее поставленная в очередь задача выполнена. Используется потоками очереди.
Для каждого вызова Queue.get()
, используемого для извлечения задачи, последующий вызов метода Queue.task_done()
сообщает очереди, что обработка задачи завершена.
Если соединение в данный момент блокируется вызовом метода Queue.join()
, то оно возобновится, когда все элементы будут обработаны. Это означает, что вызов Queue.task_done()
был получен для каждого элемента, который был помещен в очередь.
Метод Queue.task_done()
вызывает исключение ValueError
, если вызывается больше раз, чем было размещено элементов в очереди.
Queue.join()
:Метод Queue.join()
блокирует соединение, пока все элементы в очереди не будут получены и обработаны.
Количество незавершенных задач увеличивается при каждом добавлении элемента в очередь. Счетчик уменьшается, когда потребительский поток вызывает метод Queue.task_done()
, тем самым указывая, что элемент был получен и вся работа над ним завершена. Когда количество незавершенных задач падает до нуля, то Queue.join()
разблокируется.
import threading, queue q = queue.Queue() def worker(): while True: item = q.get() print(f'Working on {item}') print(f'Finished {item}') q.task_done() # Включить рабочий поток threading.Thread(target=worker, daemon=True).start() # Отправить тридцать запросов на выполнение worker() for item in range(30): q.put(item) print('Все задачи отправлены\n', end='') # Блокировать, пока все задачи не будут выполнены q.join() print('Все задачи завершены')