728x90
반응형
Graceful Shutdown
- 취소 가능한 컨텍스트 생성
- 컨텍스트와 취소 함수가 리턴됨
- 종료 시그널 감지 시 취소 함수 실행
ctx, cancel := context.WithCancel(context.Background()) defer cancel()
신호 감지
- ctrl + c -> 운영체제에서 취소 신호(interrupt 신호)를 프로세스로 넘겨줌
- signal.Notify는 신호를 감지하면 받아서 sigChan 이라는 채널로 넘겨줌
sigChan := make(chan os.Signal, 1)
signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM)
신호 감지 고루틴
- 신호가 들어올때까지 sig := <- sigChan은 기다림
- Buffered Channel 로 생각하면 될듯
- 취소 신호(interrupt 신호)를 감지하면 signal.Notify로 sigchan 채널에 취소 신호를 넘김
- sigChan 채널의 값을 sig 변수에 채널을 담고, 해당 블록은 해제됨
- 로그를 찍은 후 컨텍스트 취소 메서드를 실행
go func() {
sig := <-sigChan
log.Printf("Received signal %s, shutting down...", sig)
cancel()
}()
컨텍스트 완료 대기
- 컨텍스트 취소 함수 (cancel())가 실행되기 전까지 대기 (블록)
- 신호 감지 고루틴을 통해 취소 함수가 실행되면 대기중인 context의 채널이 닫힘
- 이렇게 되면 해당 context를 사용중인 모든 함수들에 취소 신호가 전파됨
- 컨텍스트가 취소되면 ctx.Done() 이 실행됨
<-ctx.Done()
완성본
- 전체 코드와 흐름은 아래와 같다.
- 취소 신호를 받아 컨텍스가 취소되기 전까지 실행할 함수를 넣어주면 된다.
- 실행할 함수에도 취소 가능한 context(ctx) 를 넘겨줘서, Graceful 하게 고루틴을 종료시킬 수 있음
func main() {
// 취소 가능한 context 생성
ctx, cancel := context.WithCancel(context.Background())
defer cancel() // 종료 취소 보장
// 신호 채널 생성
sigChan := make(chan os.Signal, 1)
// 취소 신호 감지 시 채널에 넘겨주는 용도
signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM)
go func() {
sig := <-sigChan // 신호가 들어올 때 까지 대기. 신호가 들어오면 해제됨
log.Printf("Received signal %s, shutting down...", sig)
cancel() // context 취소 함수 실행
}()
// 실행할 함수
lib.Download(ctx, url, fileName)
<-ctx.Done()
// 종료 로그 등, 종료
}
728x90
반응형
'백엔드 Backend > Golang' 카테고리의 다른 글
[GOLANG] 고루틴(GoRoutine) (0) | 2025.04.04 |
---|---|
[패키지] 오픈소스 패키지 발행 (0) | 2025.03.31 |
[AUTH] Cookie를 이용한 검증 (0) | 2025.01.21 |
[CORS] CORS 설정 - 라이브러리 이용 (0) | 2025.01.20 |
[Golang] DB 쿼리 nullable 데이터 처리 (0) | 2025.01.10 |