有没有更好的方法来阻止Go中的无限goroutine?

时间:2012-06-20 15:36:05

标签: go goroutine

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

1 个答案:

答案 0 :(得分:9)

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

作为参考,Go-Nuts上有this thread,其中Ian基本上是这个,而Russ补充说,“杀死个别goroutines是一件非常不稳定的事情: 不可能知道那些锁或其他资源 goroutines仍然需要清理 程序继续顺利运行。“