我使用 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。