>백엔드 개발 >Golang >컨텍스트를 사용하여 여러 Go 루틴을 정상적으로 종료하는 방법은 무엇입니까?

컨텍스트를 사용하여 여러 Go 루틴을 정상적으로 종료하는 방법은 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-12-10 05:48:14134검색

How to Gracefully Terminate Multiple Go Routines Using Context?

여러 Go 루틴을 컨텍스트와 동기화하는 방법

여러 Go 루틴을 동기화하여 그 중 하나가 반환될 때 종료되도록 허용하려면 컨텍스트는 다음을 제공합니다. 효과적인

설명:

샘플 코드는 두 개의 고루틴을 생성합니다. 이를 동기화하기 위해 context.Context가 시작되어 두 고루틴에 제공됩니다. 각 고루틴은 선택 {} 루프에 들어가 컨텍스트에서 메시지를 수신합니다.

오류가 발생하거나 특정 조건이 충족되는 경우:

  1. 기본 고루틴은 컨텍스트와 관련된 취소 함수를 호출합니다.
  2. 이것은 "완료" 메시지를 context.
  3. 컨텍스트를 수신하는 모든 고루틴은 이 메시지를 수신하고 종료합니다.

코드 샘플:

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

사용의 장점 컨텍스트:

  • 중앙 집중식 제어: 명시적인 동기화 메커니즘이 필요하지 않아 코드를 깔끔하게 유지합니다.
  • 오류 처리: 하나의 고루틴에서 오류가 발생하면 이를 통해 다른 고루틴에 알릴 수 있습니다. context.
  • 우아한 종료: 고루틴은 가능한 한 빨리 종료하라는 신호를 수신하여 잠재적인 메모리 누수를 방지합니다.

위 내용은 컨텍스트를 사용하여 여러 Go 루틴을 정상적으로 종료하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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