如何阻止可能运行或未运行的goroutine?

时间:2017-11-07 19:11:13

标签: go goroutine

我有一个go func,如果在默认情况下运行它,我想停止它。如果已经返回func,则以下方法在quit <- true被阻止。

quit := make(chan bool)
go func() {
    for {
        select {
        case <- quit:
            return
        default:
            // Do other stuff and return if complete.
        }
    }
}()

// Do stuff

// Quit goroutine
quit <- true

1 个答案:

答案 0 :(得分:2)

关闭退出渠道,而不是发送值。循环将退出,因为在封闭通道上的接收返回零值。

此外,将频道声明为chan struct{}以指示频道值对节目不重要:

quit := make(chan struct{})
go func() {
    for {
        select {
        case <- quit:
            return
        default:
            // Do other stuff and return if complete.
        }
    }
}()

// Do stuff

// Quit goroutine
close(quit)

如果你需要打破&#34;其他东西&#34;,那么将退出频道传递给&#34;其他东西&#34;并经常检查:

select {
case <- quit:
    return
default:
}
... keep going

如果你做的不仅仅是这个答案中的第一个片段,那么你应该考虑使用标准的context包来取消信号。