Golang でのティッカー チャネルの動作
ティッカー チャネルを反復処理して Stop() を呼び出すと、チャネルは一時停止しますが、閉じません。これにより、ゴルーチンが無期限にアクティブなままになる可能性があります。
ケース例:
次のコード スニペットを考えてみましょう:
package main import ( "fmt" "time" ) func main() { ticker := time.NewTicker(1 * time.Second) go func() { for _ = range ticker.C { fmt.Println("tick") } }() time.Sleep(3 * time.Second) fmt.Println("stopping ticker") ticker.Stop() time.Sleep(3 * time.Second) }
出力:
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
できる限りティッカーを停止したにもかかわらず、チャネルが閉じられていないため、ゴルーチンは無限に繰り返し続けます。
解決策:
ゴルーチンを確実に終了させる 1 つの方法は、次の方法を使用することです。次のような 2 番目のチャネル:
package main import ( "fmt" "log" "time" ) // Run the function every tick // Return false from the func 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 { fmt.Println("tick") return true }) time.Sleep(3 * time.Second) fmt.Println("stopping ticker") stop <- true time.Sleep(3 * time.Second) }
この中でコード:
以上がGolang でティッカー チャネルを使用するときに Goroutine を適切に終了するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。