신호(Signal)는 실행 중인 프로그램에 특정 동작을 요청하기 위해 보내지는 메시지입니다. 예를 들어, Ctrl+C`를 눌렀을 때 해당 SIGINT 신호를 프로그램에 보내서 실행을 중단하도록 요청하는 식입니다.
Go에서는 일반적으로 os/signal 패키지를 사용해 신호를 처리하며, 이 패키지는 신호를 채널을 통해 수신하거나 중단하는 기능을 제공합니다. Notify 함수로 특정 채널을 등록해 신호를 수신할 수 있으며, Stop 함수로 수신을 중단할 수 있습니다.
이를 활용하면 HTTP 서버와 같은 프로그램이 SIGINT를 수신했을 때 서버를 즉시 종료하는 대신 우아한 종료(Graceful Shutdown)를 구현할 수 있습니다.
우아한 종료란 새로운 요청을 받지 않고 진행 중인 작업을 완료한 후 프로그램을 종료하는 과정을 말합니다.
예를 들어, 한 번 SIGINT를 수신한 뒤 Stop 함수를 호출하여 두 번째 SIGINT가 들어오면 기본 종료 방식으로 처리될 수 있게 합니다. 이를 통해 신호 처리 흐름을 효율적으로 설계할 수 있습니다.
본문에서는 Ctrl+C
를 통해 SIGINT를 활용하는 방법을 설명하고 있습니다.
아래 프로그램은 Ctrl+C
입력을 감지하면 다음 신호 입력을 중지하고서 3초 후 종료되는 본문의 예시입니다.
func main() {
ch := make(chan os.Signal, 1)
signal.Notify(ch, os.Interrupt)
// Wait for the signal
<-ch
// Stop receiving signals
signal.Stop(ch)
fmt.Println("Shutting down...")
// Simulate a slow shutdown
time.Sleep(3 * time.Second)
// Shutdown has completed
fmt.Println("Shutdown complete")
}
더 자세한 내용은 아래 본문 링크를 통해 확인할 수 있습니다.