Сообщить об ошибке.

Объект многопоточной очереди модуля queue

Объекты очереди создаются в момент инициализации классов queue.Queue(), queue.LifoQueue() или queue.PriorityQueue() и имеют открытые методы, описанные ниже.

Содержание:


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('Все задачи завершены')