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 중국어 웹사이트의 기타 관련 기사를 참조하세요!