Golang에서 티커 채널은 정기적으로 발생하는 이벤트를 생성하는 데 일반적으로 사용됩니다. 그러나 적절한 채널 처리를 보장하려면 Stop()의 작동 방식을 이해하는 것이 중요합니다.
다음 코드 조각을 고려하세요.
ticker := time.NewTicker(1 * time.Second) go func() { for _ = range ticker.C { log.Println("tick") } log.Println("stopped") }() time.Sleep(3 * time.Second) log.Println("stopping ticker") ticker.Stop() time.Sleep(3 * time.Second)
ticker.Stop()이 호출되면 티커는 다음과 같습니다. 일시중지되었지만 채널이 자동으로 닫히지 않습니다. 이는 고루틴이 일시 중지되지만 종료되지는 않음을 의미합니다. 위 코드를 실행하면 다음 출력이 생성됩니다.
2013/07/22 14:26:53 tick 2013/07/22 14:26:54 tick 2013/07/22 14:26:55 tick 2013/07/22 14:26:55 stopping ticker
따라서 goroutine은 추가 티커 이벤트를 기다리며 차단된 상태로 유지됩니다.
이 문제를 해결하려면 두 번째 채널을 사용하여 통신할 수 있습니다. 티커 고루틴에 대한 요청을 중지합니다. 예는 다음과 같습니다.
package main import ( "log" "sync" "time" ) type Ticker struct { sync.Mutex ticker *time.Ticker stop chan struct{} } func (t *Ticker) Start(d time.Duration) { t.Lock() defer t.Unlock() if t.ticker != nil { t.ticker.Stop() } t.ticker = time.NewTicker(d) t.stop = make(chan struct{}) go func() { for { select { case <-t.ticker.C: log.Println("tick") case <-t.stop: return } } }() } func (t *Ticker) Stop() { t.Lock() defer t.Unlock() if t.stop != nil { close(t.stop) t.ticker.Stop() } } func main() { t := Ticker{} t.Start(1 * time.Second) time.Sleep(3 * time.Second) log.Println("stopping ticker") t.Stop() time.Sleep(3 * time.Second) }
별도의 중지 채널을 사용하면 Ticker.Stop() 메서드가 호출될 때 티커 고루틴이 올바르게 종료되도록 할 수 있습니다.
위 내용은 Ticker.Stop()은 Golang에서 어떻게 작동하며 티커 고루틴의 우아한 종료를 어떻게 보장할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!