>백엔드 개발 >Golang >Go에서 고루틴을 어떻게 효과적으로 종료하나요?

Go에서 고루틴을 어떻게 효과적으로 종료하나요?

DDD
DDD원래의
2024-10-30 13:15:03813검색

How do you effectively terminate a Goroutine in Go?

Go에서 Goroutine 종료

Go 루틴을 사용할 때 효율적으로 종료하는 방법을 아는 것이 필수적입니다. 다음 설정을 고려해보세요.

<code class="go">func startsMain() {
    go main()
}

func stopMain() {
    // TODO: Kill main
}

func main() {
    // Infinite loop
}</code>

이 설정은 main이라는 고루틴에 무한 루프를 생성합니다. 루프를 종료하려면 stopMain에서 고루틴을 제어할 수 있는 방법이 필요합니다.

해결책: 채널 및 선택 사용

고루틴을 종료하는 효과적인 접근 방식 중 하나는 채널과 select 문을 사용하는 것입니다.

<code class="go">var quit chan struct{}

func startLoop() {
    quit := make(chan struct{})
    go loop(quit)
}

func stopLoop() {
    close(quit)
}

func loop(quit chan struct{}) {
    for {
        select {
        case <-quit:
            return
        default:
            // Do stuff
        }
    }
}</code>

이 예에서는 quit라는 이름의 0 크기 채널(chan struct{})을 사용하여 고루틴에 중지 신호를 보냅니다. 루프 기능은 select 문을 사용하여 종료 채널을 반복적으로 확인합니다. quit가 값(중지 요청을 나타냄)을 받으면 루프가 종료됩니다.

다른 동시성 패턴

Go는 고루틴 처리를 위한 추가 동시성 패턴을 제공합니다. 이러한 패턴에 대한 자세한 내용은 Go 블로그를 방문하세요.

타이머 사용

CPU 소모를 피하면서 정기적으로 기능을 실행하려면 티커를 사용할 수 있습니다.

<code class="go">import "time"

// [...]

func loop() {
    ticker := time.NewTicker(2 * time.Second)
    defer ticker.Stop()
    for {
        select {
        case <-quit:
            return
        case <-ticker.C:
            // Do stuff
        }
    }
}</code>

이 경우 quit가 값을 받거나 티커가 실행될 때까지 차단을 선택하여 함수가 지정된 간격으로 실행되도록 합니다.

위 내용은 Go에서 고루틴을 어떻게 효과적으로 종료하나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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