본문 바로가기
Study Information Technology

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

by 옆집 김과장 2024. 8. 18.
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
반응형