我如何杀死goroutine

时间:2017-03-02 15:58:27

标签: go goroutine

我有以下设置:

func startsMain (){
    go main ()
}

fun stopMain (){
    //kill main
}

func main() {
    //infinite loop 
}

我正在创建黄瓜步骤,我需要能够启动和关闭应用程序。

1 个答案:

答案 0 :(得分:4)

你可以使用cppSTL和频道杀死无限循环!

select

很好的Go换掉了,不是吗?

现在,这个奇怪的var quit chan struct{} func startLoop() { quit := make(chan struct{}) go loop() } func stopLoop() { // As mentioned by Kaedys //close(quit) // permits signalling everyone havins such a `case <-quit:` // statement to be stopped at once, which might be even better. quit <- struct{}{} } // BTW, you cannot call your function main, it is reserved func loop() { for { select { case <-quit: break default: // do stuff. I'd call a function, for clarity: do_stuff() } } } 是什么?这是一个零大小的频道。我们只能用空结构填充它(即:chan struct{})。它可以是struct{}{}或其他任何内容,因为我们不会使用频道的内容。重要的是我们使用chan bool通道来通知我们的goroutine中的无限循环,是时候停止了。

quit语句用于捕获通道中的内容。这是一个阻塞语句(除非你输入select语句,否则将暂停执行,直到某个被case调查的通道中的某些内容放入其中。在这种情况下,每次执行default时,如果在select内放置了某些内容,则循环将中断,或者将调用quit。如果您已通过Go Tour,那么您已经知道了这一点。

其他很酷的并发模式可以在Go Blog上找到。

最后,为了获得更多乐趣,您可以使用do_stuff()来定期执行do_stuff函数,而不是消耗100%CPU,如下所示:

Ticker

此处import "time" // [...] func loop() { // This ticker will put something in its channel every 2s ticker := time.NewTicker(2 * time.Second) // If you don't stop it, the ticker will cause memory leaks defer ticker.Stop() for { select { case <-quit: return case <-ticker.C: // do stuff. I'd call a function, for clarity: do_stuff() } } } 阻止了,因为我们删除了select语句。