【问题标题】:Is there a better way to stop an infinite goroutine in Go?有没有更好的方法来停止 Go 中的无限 goroutine?
【发布时间】:2012-06-22 19:07:19
【问题描述】:

我使用 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) 使用停止通道。这些方法的缺点是我必须手动停止 goroutine。

【问题讨论】:

标签: go goroutine


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-08-04
    • 1970-01-01
    • 2023-03-27
    • 2011-07-11
    • 1970-01-01
    • 1970-01-01
    • 2019-01-12
    相关资源
    最近更新 更多