3

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

4

1 回答 1

10

停止通道是一个很好的方法。goroutine 必须自行停止。没有办法从外部杀死一个人。

作为参考,Go-Nuts 上有这个线程,Ian 基本上是这么说的,Russ 补充说:“杀死单个 goroutine 是一件非常不稳定的事情:不可能知道这些 goroutine 有哪些锁或其他资源需要清理让程序继续顺利运行。”

于 2012-06-20T16:11:10.457 回答