Jeśli przekraczam kanał ticker i stop(), kanał jest zatrzymywany, ale nie zamknięty.Zachowanie Ticker Stop w Golang
w poniższym przykładzie:
package main
import (
"time"
"log"
)
func main() {
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)
}
Bieg produkuje:
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
Więc nigdy, że goroutine wychodzi. Czy istnieje lepszy sposób na obsługę tej sprawy? Czy powinienem się przejmować, że goroutine nigdy się nie kończy?
Występuje przeciek pamięci, jeśli procedura rutowania nie zostanie zakończona. Zadzwoń zamknij (ticker.C), aby zwolnić procedurę Go. – fuz
Nie można zamknąć: "nie można zamknąć kanału tylko do odbioru" – whatupdave