Перейти к содержимому

18.5.8. Очереди

Исходный код: Lib/asyncio/queues.py

Очереди:

API очередей asyncio было спроектировано так, чтобы быть близким к классам модуля queue (Queue, PriorityQueue, LifoQueue), но оно не имеет параметра timeout. Функция asyncio.wait_for() может быть использована для отмены задачи после тайм-аута.

18.5.8.1. Очередь

class asyncio.Queue(maxsize=0, *, loop=None)

Очередь, предназначенная для координации корутин-производителя и корутин-потребителя.

Если maxsize меньше или равен нулю, размер очереди бесконечен. Если он является целым числом больше 0, то yield from put() будет блокироваться, когда очередь достигнет maxsize, пока элемент не будет удалён с помощью get().

В отличие от стандартной библиотеки queue, размер этой очереди можно надёжно узнать с помощью qsize(), поскольку однопоточное приложение asyncio не будет прервано между вызовом qsize() и выполнением операции над очередью.

Этот класс является не потокобезопасным.

Изменено в версии 3.4.4: Новые методы join() и task_done().

empty()

Возвращает True, если очередь пуста, False в противном случае.

full()

Возвращает True, если в очереди есть maxsize элементов.

Примечание

Если очередь была инициализирована с maxsize=0 (по умолчанию), то full() никогда не True.

coroutineget()

Извлекает и возвращает элемент из очереди. Если очередь пуста, ожидает, пока элемент не станет доступен.

Этот метод является корутиной.

Смотрите также

Метод empty().

get_nowait()

Удаляет и возвращает элемент из очереди.

Возвращает элемент, если он немедленно доступен, иначе возбуждает QueueEmpty.

coroutinejoin()

Блокирует выполнение, пока все элементы в очереди не будут получены и обработаны.

Счётчик незавершённых задач увеличивается каждый раз, когда элемент добавляется в очередь. Счётчик уменьшается, когда поток-потребитель вызывает task_done(), чтобы указать, что элемент был получен и вся работа над ним завершена. Когда счётчик незавершённых задач падает до нуля, join() разблокируется.

Этот метод является корутиной.

Новое в версии 3.4.4.

coroutineput(item)

Помещает элемент в очередь. Если очередь полна, ожидает, пока не освободится место, перед добавлением элемента.

Этот метод является корутиной.

Смотрите также

Метод full().

put_nowait(элемент)

Помещает элемент в очередь без блокировки.

Если свободный слот недоступен, вызывает QueueFull.

qsize()

Количество элементов в очереди.

task_done()

Указывает, что ранее поставленная в очередь задача завершена.

Используется потребителями очереди. Для каждого get(), используемого для получения задачи, последующий вызов task_done() сообщает очереди, что обработка задачи завершена.

If a join() is currently blocking, it will resume when all items have been processed (meaning that a task_done() call was received for every item that had been put() into the queue).

Вызывает ValueError, если вызван большее количество раз, чем было элементов, помещённых в очередь.

Новое в версии 3.4.4.

maxsize

Количество элементов, допустимое в очереди.

18.5.8.2. PriorityQueue

classasyncio.PriorityQueue

Подкласс Queue; извлекает записи в порядке приоритета (сначала наименьший).

Записи обычно представляют собой кортежи вида: (номер приоритета, данные).

18.5.8.3. LifoQueue

classasyncio.LifoQueue

Подкласс Queue, который извлекает первыми самые последние добавленные записи.

18.5.8.3.1. Исключения

exceptionasyncio.QueueEmpty

Исключение, вызываемое, когда метод get_nowait() вызывается для объекта Queue, который пуст.

exceptionasyncio.QueueFull

Исключение, вызываемое, когда метод put_nowait() вызывается для объекта Queue, который полон.