我使用goroutines创建了一个简单的时钟信号:
func clockloop(ch chan byte) {
count := 0
for {
time.Sleep(FRAMELEN)
count++
innerfor:
for count {
select {
case ch <- 1:
count--
default:
break innerfor
}
}
}
}
func MakeClock() chan byte {
clock := make(chan byte)
go clockloop(clock)
return clock
}
我知道这个时钟是不精确的,但这是无关紧要的。我想知道的是阻止这个goroutine的最佳方法是什么?
理想情况下,我希望它能在通道的任何听众超出范围时立即停止,但我知道如何做到这一点(很像垃圾收集器,但对于goroutines)。我想出了两种手动停止它的方法:(1)使用全局停止变量,所有这些goroutine都会检查每个循环,(2)使用停止通道。这些中的每一个的缺点是我必须手动停止goroutines。
答案 0 :(得分:9)
停止通道是一种很好的方法。 goroutine必须自行停止。没有办法从外部杀死一个。
作为参考,Go-Nuts上有this thread,其中Ian基本上是这个,而Russ补充说,“杀死个别goroutines是一件非常不稳定的事情: 不可能知道那些锁或其他资源 goroutines仍然需要清理 程序继续顺利运行。“