【发布时间】:2013-07-22 21:28:53
【问题描述】:
如果我在一个股票频道上进行测距并调用 stop() 频道将停止但未关闭。
在这个例子中:
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)
}
运行产生:
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 永远不会退出。有没有更好的方法来处理这种情况?我应该关心 goroutine 从未退出吗?
【问题讨论】:
-
如果 go 例程没有退出,你会得到内存泄漏。调用 close(ticker.C) 以释放 Go 例程。
-
无法关闭:“无法关闭仅接收通道”
-
golang 文档应该对此进行真正的扩展,但他们的 Ticker 示例确实展示了如何使用 done 通道来确保没有 go-routine 泄漏:golang.org/pkg/time/#example_NewTicker