>백엔드 개발 >Golang >Go에서 오류가 발생할 때 여러 고루틴을 정상적으로 종료하는 방법은 무엇입니까?

Go에서 오류가 발생할 때 여러 고루틴을 정상적으로 종료하는 방법은 무엇입니까?

Patricia Arquette
Patricia Arquette원래의
2024-12-07 12:03:16705검색

How to Gracefully Shutdown Multiple Goroutines in Go When an Error Occurs?

Go에서 여러 고루틴의 우아한 종료

Go 애플리케이션에서 여러 고루틴의 종료를 조정하는 것은 깔끔하고 동기적인 종료를 보장하는 데 중요합니다. 이 기사에서는 어느 루틴에서든 오류가 발생할 때 함께 반환되도록 두 개의 고루틴을 동기화하는 문제를 살펴봅니다.

다음 코드 조각을 고려하세요.

func main() {

  go func() {
    ...
    if err != nil {
      return
    }
  }()

  go func() {
    ...
    if err != nil {
      return
    }
  }()


}

이 시나리오에는 고루틴의 동기화가 필요합니다. 따라서 둘 중 하나에 오류가 발생하여 반환되면 다른 하나도 종료되어야 합니다. 문제는 닫힌 채널에 쓰기를 도입하지 않고 이를 달성하는 것입니다. 이로 인해 패닉이 발생할 수 있습니다.

고루틴 간의 통신을 위해 Go의 컨텍스트 패키지를 활용하는 것이 매우 효과적인 솔루션입니다. 컨텍스트를 생성하고 이를 각 고루틴에 전달함으로써 종료 신호를 보내는 메커니즘을 제공할 수 있습니다. 다음은 이 접근 방식을 보여주는 업데이트된 코드 조각입니다.

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()
}

이 코드에서 컨텍스트 변수 ctx는 고루틴 간의 통신 채널 역할을 합니다. 고루틴 중 하나에서 오류가 발생하면 컨텍스트에서 cancel()을 호출하여 다른 고루틴에 종료하라는 신호를 보냅니다. 이 우아한 솔루션은 패닉 위험 없이 모든 고루틴을 정상적으로 종료하도록 보장합니다.

위 내용은 Go에서 오류가 발생할 때 여러 고루틴을 정상적으로 종료하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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