목차
우아한 종료 방법
세마포어를 통해 달성
채널을 통해 달성
프로그램에 의해 모니터링되는 신호
정상 종료의 역할
Summary
백엔드 개발 Golang golang의 우아한 종료 방법에 대해 이야기합시다.

golang의 우아한 종료 방법에 대해 이야기합시다.

Apr 27, 2023 am 09:11 AM

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

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

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

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

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

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

Go Language Pack 가져 오기 : 밑줄과 밑줄이없는 밑줄의 차이점은 무엇입니까? Go Language Pack 가져 오기 : 밑줄과 밑줄이없는 밑줄의 차이점은 무엇입니까? Mar 03, 2025 pm 05:17 PM

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

Beego 프레임 워크에서 페이지간에 단기 정보 전송을 구현하는 방법은 무엇입니까? Beego 프레임 워크에서 페이지간에 단기 정보 전송을 구현하는 방법은 무엇입니까? Mar 03, 2025 pm 05:22 PM

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

MySQL 쿼리 결과 목록을 GO 언어로 사용자 정의 구조 슬라이스로 변환하는 방법은 무엇입니까? MySQL 쿼리 결과 목록을 GO 언어로 사용자 정의 구조 슬라이스로 변환하는 방법은 무엇입니까? Mar 03, 2025 pm 05:18 PM

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

GO에서 제네릭에 대한 사용자 정의 유형 제약 조건을 어떻게 정의 할 수 있습니까? GO에서 제네릭에 대한 사용자 정의 유형 제약 조건을 어떻게 정의 할 수 있습니까? Mar 10, 2025 pm 03:20 PM

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

이동 중에 테스트를 위해 모의 개체와 스터브를 작성하려면 어떻게합니까? 이동 중에 테스트를 위해 모의 개체와 스터브를 작성하려면 어떻게합니까? Mar 10, 2025 pm 05:38 PM

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

편리하게 GO 언어로 파일을 작성하는 방법? 편리하게 GO 언어로 파일을 작성하는 방법? Mar 03, 2025 pm 05:15 PM

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

GO에서 단위 테스트를 어떻게 작성합니까? GO에서 단위 테스트를 어떻게 작성합니까? Mar 21, 2025 pm 06:34 PM

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

추적 도구를 사용하여 GO 응용 프로그램의 실행 흐름을 이해하려면 어떻게해야합니까? 추적 도구를 사용하여 GO 응용 프로그램의 실행 흐름을 이해하려면 어떻게해야합니까? Mar 10, 2025 pm 05:36 PM

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

See all articles