Go에서 신호(Signal) 사용하기 | Jon Calhoun

신호(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")
}

더 자세한 내용은 아래 본문 링크를 통해 확인할 수 있습니다.

2개의 좋아요