>백엔드 개발 >Golang >golang의 우아한 종료 방법에 대해 이야기합시다.

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

PHPz
PHPz원래의
2023-04-27 09:11:061256검색

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으로 문의하세요.