목록 보기
asyncio 뽀개기 3 - SIGTERM (CTRL+C) 올바르게 처리하기
백엔드

asyncio 뽀개기 3 - SIGTERM (CTRL+C) 올바르게 처리하기

버즈빌
버즈빌
2022년 5월 30일

두줄요약

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 수신 여부 확인

다음 읽기

#Python 주제를 이어서 읽기

asyncio 뽀개기 3 - SIGTERM (CTRL+C) 올바르게 처리하기

asyncio 서버에서 요청 유실을 막기 위한 graceful shutdown 필요성을 설명합니다. SIGTERM·CTRL+C 신호를 이벤트 루프 핸들러로 처리하는 방식을 다룹니다.

버즈빌
버즈빌
백엔드

댓글 0개

댓글을 작성하려면 로그인이 필요합니다.

댓글을 불러오는 중...