>백엔드 개발 >Golang >Go의 컨텍스트 패키지는 어떻게 여러 고루틴의 우아한 종료를 보장할 수 있나요?

Go의 컨텍스트 패키지는 어떻게 여러 고루틴의 우아한 종료를 보장할 수 있나요?

Barbara Streisand
Barbara Streisand원래의
2024-12-04 17:02:11167검색

How Can Go's Context Package Ensure Graceful Termination of Multiple Goroutines?

고루틴을 컨텍스트와 동기화

Go에서는 고루틴을 사용할 때 순서대로 종료되도록 하는 문제가 있습니다. 여러 고루틴이 독립적으로 작동하는 시나리오를 생각해 보세요. 하지만 하나의 고루틴이 완료되면 다른 고루틴도 종료되도록 동기화하기를 원합니다.

제공된 코드 조각에는 지속적으로 실행되는 두 개의 고루틴이 포함되어 있습니다. 하나의 고루틴 내에서 오류가 발생하면 두 고루틴을 모두 종료하려고 합니다. 신호 완료를 위해 채널을 사용하면 닫힌 채널에 대한 쓰기로 인해 패닉이 발생할 수 있습니다.

이러한 시나리오에 권장되는 접근 방식은 고루틴 간의 통신을 허용하는 Go의 컨텍스트 패키지를 사용하는 것입니다.

In 아래 코드 예제에서는 context.WithCancel을 사용하여 취소 함수로 배경 컨텍스트를 생성합니다. 실행 중인 고루틴 수를 추적하기 위해 sync.WaitGroup이 생성됩니다.

package main

import (
    "context"
    "sync"
)

func main() {

    ctx, cancel := context.WithCancel(context.Background())
    wg := sync.WaitGroup{}
    wg.Add(3)

세 개의 고루틴이 시작됩니다. 처음 두 개의 고루틴은 지속적으로 실행되며 컨텍스트의 신호를 기다립니다. 신호를 받으면 정상적으로 종료됩니다.

    go func() {
        defer wg.Done()
        for {
            select {
            // msg from other goroutine finish
            case <-ctx.Done():
                // end
            }
        }
    }()

    go func() {
        defer wg.Done()
        for {
            select {
            // msg from other goroutine finish
            case <-ctx.Done():
                // end
            }
        }
    }()

세 번째 고루틴은 작업을 수행한 다음 취소 함수를 호출하여 작업 완료를 알립니다. 이 작업을 수행하면 컨텍스트가 닫히고 다른 두 개의 고루틴이 종료됩니다.

    go func() {
        defer wg.Done()
        // your operation
        // call cancel when this goroutine ends
        cancel()
    }()

마지막으로 wg.Wait 함수는 기본 루틴이 종료되기 전에 세 개의 고루틴이 모두 완료될 때까지 기다립니다.

    wg.Wait()
}

이 컨텍스트 기반 접근 방식은 고루틴 중 하나가 완료되면 다른 고루틴에 알림을 보내고 정상적으로 종료되도록 보장합니다. 고루틴 동기화를 처리하는 깨끗하고 효율적인 방법입니다.

위 내용은 Go의 컨텍스트 패키지는 어떻게 여러 고루틴의 우아한 종료를 보장할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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