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
, чтобы ваши пользователи не были сбиты с толку ложными предупреждающими сообщениями.