golang의 우아한 종료 방법에 대해 이야기합시다.
golang을 개발하고 사용할 때 일반적으로 실행을 종료하거나 중지해야 하는 상황에 직면하게 됩니다. 예를 들어 프로그램이 종료되거나 예외가 발생하면 정상적으로 종료되어야 합니다.
우아한 종료는 프로그램 실행을 중지하는 동시에 시작된 작업을 처리하여 데이터 손실 및 리소스 누출과 같은 문제를 방지하고 클라이언트에 불필요한 손실을 초래하지 않습니다. 이 기사에서는 golang의 우아한 종료 방법에 대해 설명합니다.
우아한 종료 방법
golang에서는 세마포어나 채널을 설정하여 구현하는 것이 어렵지 않습니다. 구체적인 구현 방법은 다음과 같습니다.
세마포어를 통해 달성
package main import ( "log" "os" "os/signal" "syscall" "time" ) func main() { stop := make(chan os.Signal, 1) signal.Notify(stop, syscall.SIGINT, syscall.SIGTERM) log.Println("Starting...") go func() { <-stop log.Println("Stopping...") // 处理关闭逻辑 time.Sleep(3 * time.Second) log.Println("Graceful shutdown finished") os.Exit(0) }() // 处理业务逻辑 for { log.Println("Running...") time.Sleep(1 * time.Second) } }
, pass make는 os.Signal 유형과 길이 1의 신호 버퍼 채널을 생성한 다음 signal 패키지의 Notify 함수를 통해 우리가 모니터링하려는 신호가 SIGINT 및 SIGTERM이라는 것을 운영 체제에 알려줍니다. 둘 다 프로그램을 나타낼 수 있습니다. . 요청을 종료합니다.
다음으로 고루틴을 시작하고 중지 채널을 수신했습니다. SIGINT 또는 SIGTERM 신호가 수신되면 고루틴 실행이 트리거됩니다. 실행 프로세스 중에 종료 논리를 처리합니다. Time.Sleep은 프로그램이 정상적으로 종료되는지 더 잘 테스트하기 위해 시간이 많이 걸리는 작업을 시뮬레이션하는 데 사용됩니다. 마지막으로 os.Exit 함수를 통해 운영 체제에 프로그램 종료 요청이 처리되었음을 알립니다.
메인 고루틴에서는 비즈니스 로직을 처리하고 매초 "실행 중..."을 인쇄합니다. 다음은 일반적으로 비즈니스 로직을 처리할 때 데이터를 저장하고 리소스를 정기적으로 해제해야 하는 간단한 예입니다. .
채널을 통해 달성
package main import ( "log" "os" "time" ) func main() { done := make(chan bool) log.Println("Starting...") go func() { osSignals := make(chan os.Signal, 1) signal.Notify(osSignals, syscall.SIGINT, syscall.SIGTERM) select { case <-osSignals: log.Println("Stopping...") // 处理关闭逻辑 time.Sleep(3 * time.Second) log.Println("Graceful shutdown finished") done <- true } }() // 处理业务逻辑 for { log.Println("Running...") time.Sleep(1 * time.Second) select { case <-done: return // 正常退出 default: continue } } }
이 코드에서는 프로그램이 완료되었는지 여부를 나타내는 부울 유형의 done 변수를 만든 다음 메인 고루틴에서 비즈니스 로직을 처리하고 "Running..."을 정기적으로 인쇄하며, 선택 기능을 통해 모니터링이 완료됩니다. done 변수를 true로 설정하면 프로그램이 종료되고 메인 함수로 복귀하여 프로그램 종료가 완료됩니다.
또 다른 고루틴에서는 make를 통해 os.Signal 유형과 길이 1의 신호 버퍼 채널을 만든 다음 signal 패키지의 Notify 함수를 통해 모니터링하려는 신호가 SIGINT 및 SIGTERM임을 운영 체제에 알립니다. 다음으로, select 함수를 통해 osSignals를 수신합니다. SIGINT 또는 SIGTERM 신호가 수신되면 특정 작업이 트리거됩니다.
프로그램에 의해 모니터링되는 신호
Linux 시스템에는 일반적으로 다음과 같은 신호가 있습니다.
신호 이름 | 신호 설명 |
---|---|
SIGINT | 일반적으로 Control+C를 통해 실행되는 터미널 인터럽트 문자 |
SIGTERM | 종료 신호는 일반적으로 프로그램 자체 실행을 중지하도록 요청하는 데 사용됩니다. |
SIGHUP | Hang 신호는 일반적으로 터미널 연결이 중단되었으며 구성 파일을 다시 시작해야 함을 나타냅니다. |
SIGUSR1 -31 | 사용자 정의 신호 |
SIGKILL | 프로세스 종료 신호, 포착하거나 무시할 수 없음, 프로세스를 폭력적으로만 종료할 수 있음 |
SIGSTOP | 프로세스 중지 신호, 불가능 잡히거나 무시되면 프로세스를 폭력적으로 중지할 수만 있습니다 |
SIGCONT | 프로세스를 계속 실행하세요 |
SIGPIPE | 파이프 파열 신호는 일반적으로 상대방이 데이터를 읽을 때 연결을 종료했음을 의미합니다 |
SIGALRM | 특정 알람 신호를 정기적으로 트리거하는 데 사용되는 알람 시계 신호 작업 |
SIGCHLD | 하위 프로세스 종료 신호 |
일반적으로 SIGINT 및 SIGTERM 신호만 들으면 됩니다.
정상 종료의 역할
정상 종료를 통해 요청 및 작업 실패로 인한 데이터 손실, 리소스 누출 및 기타 문제를 방지할 수 있습니다. 이는 서비스를 제공하는 장기 실행 프로그램 및 애플리케이션에 특히 중요합니다. 특히 분산 시스템과 마이크로서비스 아키텍처에서 정상적인 종료는 시스템 안정성과 성능을 효과적으로 보장할 수 있습니다. 목표로 하는 문제 처리 기능이 없으면 프로그램이 임의로 종료되거나 중지 신호를 받은 후 충돌이 발생하여 심각한 문제가 발생할 수 있습니다. 고객에게 불필요한 손실을 입힙니다.
Summary
이번 글을 통해 우리는 golang의 채널과 os/signal 패키지를 사용하여 우아한 종료를 하는 방법과, 신호를 듣고 우아한 종료를 완료하는 방법을 배웠습니다. 실제 개발에서 애플리케이션의 정상적인 종료는 매우 중요한 작업이며, 정상적인 종료는 프로그램의 안정성을 효과적으로 향상시키고 리소스 낭비 및 데이터 손실과 같은 문제를 방지할 수 있습니다.
위 내용은 golang의 우아한 종료 방법에 대해 이야기합시다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











이 기사에서는 GO의 패키지 가져 오기 메커니즘을 설명합니다. 명명 된 수입 (예 : 가져 오기 & quot; fmt & quot;) 및 빈 가져 오기 (예 : import _ & quot; fmt & quot;). 명명 된 가져 오기는 패키지 내용을 액세스 할 수있게하고 빈 수입은 t 만 실행합니다.

이 기사에서는 웹 애플리케이션에서 페이지 간 데이터 전송에 대한 Beego의 NewFlash () 기능을 설명합니다. NewFlash ()를 사용하여 컨트롤러간에 임시 메시지 (성공, 오류, 경고)를 표시하여 세션 메커니즘을 활용하는 데 중점을 둡니다. 한계

이 기사에서는 MySQL 쿼리 결과를 GO 구조 슬라이스로 효율적으로 변환합니다. 수동 구문 분석을 피하고 최적의 성능을 위해 데이터베이스/SQL의 스캔 방법을 사용하는 것을 강조합니다. DB 태그 및 Robus를 사용한 구조물 필드 매핑에 대한 모범 사례

이 기사에서는 GO의 제네릭에 대한 사용자 정의 유형 제약 조건을 살펴 봅니다. 인터페이스가 일반 함수에 대한 최소 유형 요구 사항을 정의하여 유형 안전 및 코드 재사성을 향상시키는 방법에 대해 자세히 설명합니다. 이 기사는 또한 한계와 모범 사례에 대해 설명합니다

이 기사는 단위 테스트를 위해 이동 중에 모의와 스터브를 만드는 것을 보여줍니다. 인터페이스 사용을 강조하고 모의 구현의 예를 제공하며 모의 집중 유지 및 어설 션 라이브러리 사용과 같은 모범 사례에 대해 설명합니다. 기사

이 기사는 OS.WriteFile (작은 파일에 적합)과 OS.OpenFile 및 Buffered Writes (큰 파일에 최적)를 비교하여 효율적인 파일 쓰기를 자세히 설명합니다. 강력한 오류 처리, 연기 사용 및 특정 오류 확인을 강조합니다.

이 기사는 GO에서 단위 테스트 작성, 모범 사례, 조롱 기술 및 효율적인 테스트 관리를위한 도구를 다루는 것에 대해 논의합니다.

이 기사는 추적 도구를 사용하여 GO 응용 프로그램 실행 흐름을 분석합니다. 수동 및 자동 계측 기술, Jaeger, Zipkin 및 OpenTelemetry와 같은 도구 비교 및 효과적인 데이터 시각화를 강조합니다.
