PHpullh
학습 라이브러리/Python/그레이스풀 종료

PYTHON · 예외처리

그레이스풀 종료

시그널 핸들링으로 프로그램을 안전하게 종료하고 리소스를 정리합니다.

예외처리중급signal종료gracefulatexit

핵심 설명

시그널 핸들링으로 프로그램을 안전하게 종료하고 리소스를 정리합니다.

Python code

import signal
import sys
import atexit

# atexit: 프로그램 종료 시 실행
def cleanup():
    print("  정리 작업 수행 중...")
    print("  리소스 해제 완료")

atexit.register(cleanup)

# 시그널 핸들러
class GracefulShutdown:
    def __init__(self):
        self.should_stop = False
        signal.signal(signal.SIGTERM, self._handler)
        signal.signal(signal.SIGINT, self._handler)

    def _handler(self, signum, frame):
        sig_name = signal.Signals(signum).name
        print(f"\n{sig_name} 수신, 종료 중...")
        self.should_stop = True

# 사용 예시
shutdown = GracefulShutdown()

# 워커 루프 시뮬레이션
import time
for i in range(3):
    if shutdown.should_stop:
        print("안전하게 종료합니다")
        break
    print(f"작업 {i+1} 처리 중...")
    time.sleep(0.1)

# try/finally 패턴
class Resource:
    def __init__(self, name):
        self.name = name
        print(f"  {name} 획득")

    def close(self):
        print(f"  {self.name} 해제")

r = Resource("DB 연결")
try:
    print("  작업 수행")
finally:
    r.close()

print("프로그램 정상 종료")

학습 팁

장기 실행 서비스에서는 SIGTERM 핸들러를 등록하여 진행 중인 작업을 완료한 후 종료하세요.

주의할 점

SIGKILL(kill -9)은 핸들링할 수 없습니다. 반드시 SIGTERM을 먼저 보내고 시간을 줘야 합니다.

자주 묻는 질문

그레이스풀 종료란 무엇인가요?

시그널 핸들링으로 프로그램을 안전하게 종료하고 리소스를 정리합니다.

그레이스풀 종료 학습 시 주의할 점은 무엇인가요?

SIGKILL (kill -9)은 핸들링할 수 없습니다. 반드시 SIGTERM 을 먼저 보내고 시간을 줘야 합니다.