signal
Last updated
Was this helpful?
Last updated
Was this helpful?
Этот модуль предоставляет механизмы для использования обработчиков сигналов в Python.
Функция позволяет определять пользовательские обработчики, которые будут выполняться при получении сигнала. Установлено небольшое количество обработчиков по умолчанию: игнорируется (поэтому об ошибках записи в каналах и сокетах можно сообщать как об обычных исключениях Python), а преобразуется в исключение KeyboardInterrupt, если родительский процесс не изменил его.
После установки обработчик для конкретного сигнала остается установленным до его явного сброса (Python эмулирует интерфейс стиля BSD независимо от базовой реализации), за исключением обработчика для , который следует базовой реализации.
Обработчик сигналов Python не выполняется внутри обработчика сигналов низкого уровня (C). Вместо этого обработчик сигналов низкого уровня устанавливает флаг, который сообщает виртуальной машине выполнить соответствующий обработчик сигнала Python в более поздний момент (например, в следующей инструкции байт-кода). Это имеет последствия:
Бессмысленно отлавливать синхронные ошибки, такие как или , вызванные недопустимой операцией в коде C. Python вернется из обработчика сигнала в код C, который, вероятно, снова вызовет тот же сигнал, что приведет к зависанию Python. Начиная с Python 3.3, вы можете использовать модуль обработки ошибок для сообщения о синхронных ошибках.
Долговременные вычисления, реализованные исключительно на C (например, сопоставление регулярных выражений для большого объема текста), могут выполняться непрерывно в течение произвольного количества времени, независимо от полученных сигналов. Обработчики сигналов Python будут вызваны по окончании вычислений.
Обработчики сигналов Python всегда выполняются в основном потоке Python, даже если сигнал был получен в другом потоке. Это означает, что сигналы нельзя использовать как средство межпоточного взаимодействия. Вместо этого вы можете использовать примитивы синхронизации из модуля .
Кроме того, только основной поток может устанавливать новый обработчик сигнала.
Изменено в версии 3.5: перечисленные ниже константы, связанные с сигналом (SIG*), обработчиком (, ) и sigmask (, , ), были преобразованы в перечисления . Функции , , и возвращают удобочитаемые перечисления .
В модуле signal определены следующие переменные:
signal.SIGABRT
signal.SIGBREAK
signal.SIGBUS
не заполнено...
не заполнено...
Модуль signal определяет одно исключение:
signal.ItimerError exception
Модуль signal определяет следующие функции:
signal.getsignal ()
signal.strsignal ()
signal. valid_signals ()
не заполнено...
не заполнено...
- выполняет функцию по умолчанию для сигнала
- обработчик просто игнорирует данный сигнал
- сигнал таймера от alarm(2) в Unix
- дочерний процесс остановлен или прекращен
- определяемый пользователем сигнал 1
- определяемый пользователем сигнал 2
- отправляет сигнал SIGALRM через указанное количество секунд
- приостанавливает процесс, пока не будет перехвачен следующий сигнал
- задает обработчик для сигнала
Вот минимальный пример программы. Он использует функцию , чтобы ограничить время ожидания открытия файла; это полезно, если файл предназначен для последовательного устройства, которое не может быть включено, что обычно приводит к зависанию на неопределенное время. Решение - установить 5-секундный сигнал тревоги перед открытием файла; если операция длится слишком долго, будет отправлен аварийный сигнал, и обработчик вызовет исключение.
Передача вывода вашей программы по конвейеру таким инструментам, как , вызовет отправку сигнала вашему процессу, когда приемник его стандартного вывода закроется раньше. Это приводит к возникновению исключения, например BrokenPipeError: [Errno 32] Broken pipe
. Чтобы обработать этот случай, оберните вашу точку входа, чтобы перехватить это исключение, следующим образом:
Не устанавливайте для значение , чтобы избежать ошибки BrokenPipeError. Это может привести к неожиданному завершению вашей программы также всякий раз, когда какое-либо соединение сокета прерывается, пока ваша программа все еще пишет в него.