>  기사  >  백엔드 개발  >  Go의 티커 채널에서 실행되는 고루틴을 정상적으로 중지하는 방법은 무엇입니까?

Go의 티커 채널에서 실행되는 고루틴을 정상적으로 중지하는 방법은 무엇입니까?

Patricia Arquette
Patricia Arquette원래의
2024-11-09 01:40:02434검색

How to Gracefully Stop a Goroutine Running on a Ticker Channel in Go?

Go에서 티커 중지 동작 관리

채널을 다룰 때 보내기 및 받기 작업의 동작을 고려하는 것이 중요합니다. 티커 채널의 경우,ticker.Stop()을 호출하면 티커가 새 값을 생성하는 것을 중지하지만 채널 자체는 계속 열려 있습니다.

도전 과제: Goroutine 매달기

제공된 코드 조각은 티커 채널에 걸쳐 있는 고루틴을 보여줍니다. 그러나 Ticker.Stop()이 호출되면 채널이 닫히지 않기 때문에 고루틴은 무기한 활성 상태로 유지됩니다.

해결책: 두 번째 채널 사용

우아하게 처리하려면 이 상황에서는 보조 채널(중지)이 도입될 수 있습니다. 고루틴은 select 문의 티커 채널과 중지 채널을 모두 수신할 수 있습니다. 중지 신호가 중지 채널에서 수신되면 고루틴은 자체적으로 닫히고 종료될 수 있습니다.

아래 수정된 코드는 이 솔루션을 통합합니다.

package main

import (
    "log"
    "time"
)

// Every runs the provided function every tick.
// Return false from the function to stop the ticker.
func Every(duration time.Duration, work func(time.Time) bool) chan bool {
    ticker := time.NewTicker(duration)
    stop := make(chan bool, 1)

    go func() {
        defer log.Println("ticker stopped")
        for {
            select {
            case time := <-ticker.C:
                if !work(time) {
                    stop <- true
                }
            case <-stop:
                return
            }
        }
    }()

    return stop
}

func main() {
    stop := Every(1*time.Second, func(time.Time) bool {
        log.Println("tick")
        return true
    })

    time.Sleep(3 * time.Second)
    log.Println("stopping ticker")
    stop <- true
    time.Sleep(3 * time.Second)
}

ticker.Stop()이 다음과 같은 경우 이제 호출되면 중지 채널에 신호가 전송되어 티커가 값 생성을 중지한 후에도 고루틴이 정상적으로 종료됩니다.

위 내용은 Go의 티커 채널에서 실행되는 고루틴을 정상적으로 중지하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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