본문 바로가기

Study Information Technology

Python의 signal 모듈을 활용한 비동기 이벤트 처리

728x90
반응형

Python의 signal 모듈을 활용한 비동기 이벤트 처리

Overview

Python의 signal 모듈은 운영 체제의 신호를 처리할 수 있게 해주는 도구입니다. 이 모듈을 통해 외부 신호나 이벤트를 효과적으로 관리하고, 비동기적인 이벤트 처리를 통해 프로그램의 반응성을 향상시킬 수 있습니다. signal 모듈을 사용하면, 예를 들어 프로그램이 종료될 때 특별한 작업을 수행하거나, 시간 제한 작업을 설정하는 등의 작업을 쉽게 구현할 수 있습니다.

기본 개념

신호는 운영 체제나 다른 프로세스에서 프로그램에 보내는 특정한 메시지입니다. 이 메시지는 보통 프로세스의 실행을 제어하거나 상태를 변경하는 데 사용됩니다. 예를 들어, SIGINT 신호는 사용자가 Ctrl+C를 눌러 프로그램을 중단할 때 발생합니다. Python의 signal 모듈은 이러한 신호를 처리하고, 적절한 대응을 하도록 도와줍니다.

주요 함수 및 사용법

  1. signal.signal(signalnum, handler)
  • 설명: 특정 신호(signalnum)가 발생했을 때 호출될 핸들러 함수(handler)를 등록합니다.
  • 예시: 프로그램 종료 시 정리 작업을 수행하도록 설정합니다.
import signal
import sys

def handler(signum, frame):
print("프로그램 종료 시 정리 작업 수행")
sys.exit(0)

signal.signal(signal.SIGINT, handler)
print("프로그램 실행 중... Ctrl+C를 눌러 종료")
signal.pause()  # 신호를 기다립니다

여기서 signal.pause()는 신호가 발생할 때까지 프로그램을 멈추게 합니다. Ctrl+C를 누르면 SIGINT 신호가 발생하고, 등록된 핸들러가 호출됩니다.

  1. signal.alarm(seconds)
  • 설명: 지정된 초(seconds) 후에 SIGALRM 신호를 발생시킵니다.
  • 예시: 시간 초과를 설정하여 일정 시간이 지나면 자동으로 작업을 중단합니다.
import signal
import time

def alarm_handler(signum, frame):
print("시간 초과 발생!")
raise TimeoutError("시간 초과")

signal.signal(signal.SIGALRM, alarm_handler)
signal.alarm(5)  # 5초 후에 SIGALRM 신호 발생

try:
print("시간 초과를 기다리는 중...")
time.sleep(10)  # 10초 동안 대기
except TimeoutError as e:
print(e)

이 코드에서는 signal.alarm(5)가 설정되어 5초 후 SIGALRM 신호가 발생하며, 이를 처리하는 핸들러가 호출됩니다.

  1. signal.setitimer(which, seconds, interval)
  • 설명: 지정된 시간(seconds) 후에 신호를 발생시키고, 이후 주기적으로(interval) 신호를 발생시킵니다.
  • 예시: 정기적으로 작업을 수행하도록 설정합니다.
import signal
import time

def timer_handler(signum, frame):
print("정기 타이머 신호")

signal.signal(signal.ITIMER_REAL, timer_handler)
signal.setitimer(signal.ITIMER_REAL, 2, 2)  # 2초 후에 첫 신호 발생, 이후 2초마다 발생

try:
while True:
time.sleep(1)  # 프로그램이 계속 실행되도록
except KeyboardInterrupt:
print("프로그램 종료")

이 예제에서는 2초 후 첫 신호를 보내고, 이후 2초마다 반복하여 신호를 보내는 타이머를 설정합니다.

에러 처리 및 주의사항

  • 에러 코드: 잘못된 신호 번호를 전달하거나 핸들러 함수에서 예외가 발생하면 ValueErrorTypeError가 발생할 수 있습니다.
  • 해결책:
  • 신호 번호는 올바른 상수를 사용해야 하며, 핸들러 함수는 두 개의 인자를 받아야 합니다 (signumframe).
  • 핸들러 함수 내에서 예외를 처리하고, 필요한 경우 적절한 정리 작업을 수행하도록 합니다.

참고문서

이러한 기능들을 활용하면 비동기적 이벤트 처리와 프로그램의 신호 응답성을 효과적으로 개선할 수 있습니다.

728x90
반응형