Создание и обработка ошибок динамического выделения памяти при переполнении очереди
Обновлено: 21.11.2024
Модуль очереди реализует очереди с несколькими поставщиками и несколькими потребителями. Это особенно полезно в многопоточном программировании, когда необходимо безопасно обмениваться информацией между несколькими потоками. Класс Queue в этом модуле реализует всю необходимую семантику блокировки.
В модуле реализованы три типа очередей, которые отличаются только порядком извлечения записей. В очереди FIFO первые добавленные задачи извлекаются первыми. В очереди LIFO самая последняя добавленная запись является первой извлеченной (работает как стек). В очереди с приоритетом записи сортируются (с помощью модуля heapq), и запись с наименьшим значением извлекается первой.
Внутри эти три типа очередей используют блокировки для временной блокировки конкурирующих потоков; однако они не предназначены для обработки повторного входа в потоке.
Кроме того, модуль реализует «простой» тип очереди FIFO, SimpleQueue , конкретная реализация которого обеспечивает дополнительные гарантии в обмен на меньшую функциональность.
Модуль очереди определяет следующие классы и исключения:
очередькласса. Очередь ( maxsize = 0 ) ¶
очередькласса. LifoQueue ( maxsize = 0 ) ¶
очередькласса. PriorityQueue ( maxsize = 0 ) ¶
Конструктор приоритетной очереди. maxsize – это целое число, задающее верхний предел количества элементов, которые можно поместить в очередь. Вставка будет заблокирована, как только этот размер будет достигнут, пока элементы очереди не будут израсходованы. Если maxsize меньше или равно нулю, размер очереди бесконечен.
Записи с наименьшим значением извлекаются первыми (запись с наименьшим значением — это запись, возвращаемая sorted(list(entries))[0] ). Типичным шаблоном для записей является кортеж в форме: (номер_приоритета, данные) .
Если элементы data несопоставимы, данные могут быть заключены в класс, который игнорирует элемент данных и сравнивает только номер приоритета:
Новое в версии 3.7.
Исключение возникает при вызове неблокирующего метода get() (или get_nowait()) для пустого объекта Queue.
очередьисключений. Полный ¶
Исключение возникает, когда неблокирующий метод put() (или put_nowait() ) вызывается для объекта Queue, который заполнен.
Очередь объектов¶
Объекты очереди ( Queue , LifoQueue или PriorityQueue ) предоставляют общедоступные методы, описанные ниже.
Возвращает приблизительный размер очереди. Обратите внимание, что qsize() > 0 не гарантирует, что последующий вызов get() не будет заблокирован, равно как и qsize() Queue. пустой ( ) ¶
Возвращает значение True, если очередь пуста, и значение False в противном случае. Если empty() возвращает True, это не гарантирует, что последующий вызов put() не будет заблокирован. Точно так же, если empty() возвращает False, это не гарантирует, что последующий вызов get() не будет заблокирован.
Возвращает значение True, если очередь заполнена, и значение False в противном случае. Если full() возвращает True, это не гарантирует, что последующий вызов get() не будет заблокирован. Точно так же, если full() возвращает False, это не гарантирует, что последующий вызов put() не будет заблокирован.
Очередь. put ( item , block = True , timeout = None ) ¶
Поместите элемент в очередь. Если для необязательных аргументов block установлено значение true, а для timeout установлено значение None (по умолчанию), заблокируйте, если необходимо, до тех пор, пока не освободится свободный слот. Если timeout является положительным числом, блокируется не более timeout секунд и возникает исключение Full, если в течение этого времени не было свободного слота. В противном случае (block имеет значение false), поместите элемент в очередь, если свободный слот сразу доступен, в противном случае вызовите полное исключение (в этом случае timeout игнорируется).< /p>
Очередь. put_nowait ( элемент ) ¶
Эквивалентно put(item, False) .
Очередь. get ( block = True , timeout = None ) ¶
Удалить и вернуть элемент из очереди. Если для необязательных аргументов block установлено значение true, а для timeout установлено значение None (по умолчанию), при необходимости заблокируйте, пока элемент не будет доступен. Если timeout является положительным числом, блокируется не более timeout секунд и возникает исключение Empty, если в течение этого времени ни один элемент не был доступен. В противном случае (block имеет значение false), верните элемент, если он сразу доступен, в противном случае вызовите исключение Empty (в этом случае время ожидания игнорируется).
До версии 3.0 в системах POSIX и для всех версий Windows, если для параметра block задано значение true, а для timeout установлено значение None , эта операция переходит в непрерывное ожидание базового замок. Это означает, что никакие исключения не могут возникнуть, и, в частности, SIGINT не вызовет прерывание клавиатуры.
Эквивалентно get(False) .
Для поддержки отслеживания того, были ли поставленные в очередь задачи полностью обработаны потоками-потребителями демона, предлагаются два метода.
Указывает, что ранее поставленная в очередь задача завершена.Используется потоками-потребителями очереди. Для каждого метода get(), используемого для извлечения задачи, последующий вызов task_done() сообщает очереди, что обработка задачи завершена.
Если функция join() в данный момент блокируется, она возобновится, когда все элементы будут обработаны (это означает, что вызов task_done() был получен для каждого элемента, помещенного в очередь put()).
Вызывает ошибку ValueError, если вызывается больше раз, чем элементов было помещено в очередь.
Блокируется до тех пор, пока все элементы в очереди не будут получены и обработаны.
Счетчик незавершенных задач увеличивается всякий раз, когда элемент добавляется в очередь. Счетчик уменьшается всякий раз, когда поток-потребитель вызывает task_done(), чтобы указать, что элемент был получен и вся работа над ним завершена. Когда количество незавершенных задач падает до нуля, функция join() разблокируется.
Пример ожидания завершения поставленных в очередь задач:
Простые объекты очереди¶
Объекты SimpleQueue предоставляют общедоступные методы, описанные ниже.
Возвращает приблизительный размер очереди. Обратите внимание, что qsize() > 0 не гарантирует, что последующая функция get() не будет заблокирована.
Возвращает значение True, если очередь пуста, и значение False в противном случае. Если empty() возвращает False, это не гарантирует, что последующий вызов get() не будет заблокирован.
Простая очередь. put ( item , block = True , timeout = None ) ¶
Поместите элемент в очередь. Этот метод никогда не блокируется и всегда завершается успешно (за исключением потенциальных низкоуровневых ошибок, таких как сбой выделения памяти). Необязательные аргументы block и timeout игнорируются и предоставляются только для совместимости с Queue.put() .
Детали реализации CPython: этот метод имеет реентерабельную реализацию C. То есть вызов put() или get() может быть прерван другим вызовом put() в том же потоке без блокировки или повреждения внутреннего состояния внутри очереди. Это делает его подходящим для использования в деструкторах, таких как методы __del__ или обратные вызовы weakref.
Эквивалентно put(item) , предоставлено для совместимости с Queue.put_nowait() .
Простая очередь. get ( block = True , timeout = None ) ¶
Удалить и вернуть элемент из очереди. Если для необязательных аргументов block установлено значение true, а для timeout установлено значение None (по умолчанию), при необходимости заблокируйте, пока элемент не будет доступен. Если timeout является положительным числом, блокируется не более timeout секунд и возникает исключение Empty, если в течение этого времени ни один элемент не был доступен. В противном случае (block имеет значение false), верните элемент, если он сразу доступен, в противном случае вызовите исключение Empty (в этом случае время ожидания игнорируется).
Эквивалентно get(False) .
Класс очереди для использования в многопроцессорном (а не многопоточном) контексте.
Читайте также: