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

Функция set_wakeup_fd() модуля signal в Python

Дескриптор файла пробуждения

Синтаксис:

import signal

signal.set_wakeup_fd(fd, *, warn_on_full_buffer=True)

Параметры:

  • fd - дескриптор файла,
  • warn_on_full_buffer=True - флаг управления буфером.

Возвращаемое значение:

  • старый файловый дескриптор fd.

Описание:

Функция set_wakeup_fd() модуля signal устанавливает дескриптор файла пробуждения на fd. Когда сигнал принят, номер сигнала записывается в виде одного байта в fd. Такое поведение может быть использовано библиотекой для старта/пробуждения опроса или выбора вызова, что позволяет полностью обработать сигнал.

Функция возвращает старый wakeup файловый дескриптор fd или -1, если wakeup дескриптора файла не был включен.

  • Если fd равен -1, то пробуждение дескриптора файла отключено.
  • Если fd не равен -1, то fd должен быть неблокирующим.

Это должно быть до библиотеки, что бы удалить все байты перед очередным вызовом.

В случае многопоточности функция signal.set_wakeup_fd() может быть вызвана только из основного потока, попытка вызова из других потоков вызовет исключение ValueError.

Примеры:

Есть два распространенных способа использования этой функции. В обоих используются fd для пробуждения при поступлении сигнала, но они отличаются тем, как определяется, какой сигнал или сигналы поступили.

При первом подходе - читаем данные из буфера fd, а значения байтов дают номера сигналов. Это просто, но в редких случаях это может привести к проблеме: обычно у fd будет ограниченный объем буферного пространства, и если слишком много сигналов поступает слишком быстро, тогда буфер может быть заполнен и некоторые сигналы могут быть потеряны. Если использовать этот подход, то необходимо установить warn_on_full_buffer=True, что по крайней мере приведет к тому, что при потере сигналов будет напечатано предупреждение в stderr .

Во втором подходе - используем wakeup fd только для пробуждений и игнорируем действительные значения байтов. В этом случае все, что нас волнует, это то, является ли буфер fd пустым или не пустым. Полный буфер не указывает на проблему вообще. Если использовать этот подход, то необходимо установить warn_on_full_buffer=False, чтобы ваши пользователи не были сбиты с толку ложными предупреждающими сообщениями.