Рубрики
Без рубрики

Модуль сигналов Python – Что такое сигналы и как их создавать?

В этой статье мы рассмотрим использование модуля сигнала Python.

Автор оригинала: Pankaj Kumar.

В этой статье мы рассмотрим использование модуля сигнала Python.

Этот модуль очень полезен, когда мы хотим обрабатывать определенные сигналы с помощью Python.

Во-первых, давайте посмотрим, что означает сигнал.

Что такое Сигнал?

Сигнал-это средство, с помощью которого программа может получать информацию от операционной системы. Когда операционная система получает определенные события, она может передавать их программам в виде сигналов.

Например, когда мы нажимаем клавиши Ctrl + C на нашей клавиатуре, Операционная система генерирует сигнал и передает его программам. Для этой конкретной комбинации генерируется сигнал SIGINT и передается программам.

Для всех распространенных операционных систем существует стандартный шаблон для назначения этих сигналов, которые, как правило, являются короткими для целых чисел.

В Python эти сигналы определяются в модуле signal .

import signal

Чтобы просмотреть все допустимые сигналы в вашей системе (зависит от операционной системы), вы можете использовать signals.valid_signals()

import signal

valid_signals = signals.valid_signals()

print(valid_signals)

Выход

{, , , , , , , , , , , , , , , 16, , , , , , , , , , , , , , , , , 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, }

Теперь для всех сигналов есть некоторые действия по умолчанию, которые ОС назначит каждой программе.

Если мы хотим иметь какое-то другое поведение, мы можем использовать обработчики сигналов!

Что такое обработчик сигналов Python?

Обработчик сигналов-это определяемая пользователем функция, в которой можно обрабатывать сигналы Python.

Если мы возьмем сигнал SIGINT (Сигнал прерывания), поведение по умолчанию будет заключаться в остановке текущей запущенной программы.

Однако мы можем назначить обработчик сигнала для обнаружения этого сигнала и вместо этого выполнить нашу пользовательскую обработку!

Давайте посмотрим, как мы можем это сделать.

import signal  
import time  

# Our signal handler
def signal_handler(signum, frame):  
    print("Signal Number:", signum, " Frame: ", frame)  

def exit_handler(signum, frame):
    print('Exiting....')
    exit(0)

# Register our signal handler with `SIGINT`(CTRL + C)
signal.signal(signal.SIGINT, signal_handler)

# Register the exit handler with `SIGTSTP` (Ctrl + Z)
signal.signal(signal.SIGTSTP, exit_handler)

# While Loop
while 1:  
    print("Press Ctrl + C") 
    time.sleep(3) 

Здесь, после запуска нашей программы, при нажатии Ctrl + C программа перейдет к функции signal_handler () , так как мы зарегистрировали обработчик с помощью SIGINT (Ctrl + C).

У нас также есть другой обработчик exit_handler () , который завершает работу программы, если мы нажимаем Ctrl + Z, который посылает сигнал SIGTSTP .

Давайте посмотрим на результат

Выход

Press Ctrl + C
^CSignal Number: 2  Frame:  >
^ZExiting....

Здесь я нажал Ctrl + C, чтобы перейти к функции signal_handler () , а затем нажал Ctrl + Z, чтобы выйти из программы. Обратите внимание, что существует также объект кадра стека ( frame ) для отслеживания стека времени выполнения основной программы.

Использование Сигналов Тревоги

Мы можем использовать сигнал SIGALRM для отправки тревожных сигналов в нашу программу. Давайте напишем простой обработчик сигнала, который обрабатывает этот сигнал Python.

import signal  
import time  

def alarm_handler(signum, frame):  
    print('Alarm at:', time.ctime())  

# Register the alarm signal with our handler
signal.signal(signal.SIGALRM, alarm_handler)

signal.alarm(3)  # Set the alarm after 3 seconds  

print('Current time:', time.ctime())  

time.sleep(6)  # Make a sufficient delay for the alarm to happen 

В последней строке мы спим достаточное время (6 секунд), чтобы сигнал тревоги прошел в нашу программу. В противном случае, поскольку программа завершилась бы, сигнал не будет принят!

Выход

Current time: Thu Jul 23 00:41:40 2020
Alarm at: Thu Jul 23 00:41:43 2020

Вывод

В этой статье мы узнали о том, как настроить обработчики сигналов для обработки различных сигналов с помощью модуля signal . Посетите ссылку здесь, чтобы узнать больше о модулях |/Python

Рекомендации