
asyncio 뽀개기 3 - SIGTERM (CTRL+C) 올바르게 처리하기
두줄요약
asyncio 서버에서 SIGINT·SIGTERM을 안전하게 처리하는 signal handler 구성을 설명했습니다.\n작업 취소, 이벤트 루프 종료, 컨테이너 환경의 signal 전달 주의점을 함께 다뤘습니다.
구조와 흐름
- Unix 프로세스 간 통신 수단인 signal과 SIGTERM·SIGKILL·SIGINT의 종료 의미
- Docker stop·kubectl delete pod의 SIGTERM 전송과 제한 시간 후 SIGKILL 전환
- asyncio의
loop.add_signal_handler를 통한 이벤트 루프 기반 signal 처리
선택 이유
KeyboardInterrupt만으로는 SIGINT만 처리 가능하고 종료 처리 도중 재발생하는 signal 대응 한계signal.signal()대신 이벤트 루프를 깨우는 장치를 포함한loop.add_signal_handler사용 권장- 초기화 작업보다 이른 signal handler 등록으로 처리 공백 최소화
주의할 점
- SIGKILL·SIGSTOP은 사용자 정의 handler 등록 불가
- 비동기 handler는
loop.create_task로 등록 가능하지만 task 포화·CPU 집약 작업에 따른 실행 지연 가능성 - 전체 task 취소 시
CancelledError처리와asyncio.gather를 통한 종료 대기 필요
적용해볼 점
- SIGINT·SIGTERM handler에서 종료 플래그 설정 또는
loop.stop()호출 asyncio.all_tasks()의 task 취소로 graceful shutdown 구성- Docker ENTRYPOINT·스크립트 구성에서 애플리케이션의 signal 수신 여부 확인



