如何停止一个协程

新手上路,请多包涵

我有一个调用方法的 goroutine,并在通道上传递返回值:

 ch := make(chan int, 100)
go func(){
    for {
        ch <- do_stuff()
    }
}()

我如何停止这样的协程?

原文由 Łukasz Gruner 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 693
2 个回答

编辑: 在意识到您的问题是关于将值发送到 goroutine 中的 chan 之前,我匆忙写下了这个答案。下面的方法可以与上面建议的额外通道一起使用,或者使用你已经拥有的通道是双向的这一事实,你可以只使用一个……

如果您的 goroutine 仅用于处理来自 chan 的项目,您可以使用内置的“close”和通道的特殊接收表单。

也就是说,一旦你在 chan 上发送完项目,你就关闭它。然后在你的 goroutine 中,你会得到一个额外的参数给 receive 操作符,显示通道是否已经关闭。

这是一个完整的示例(等待组用于确保进程继续直到 goroutine 完成):

 package main

import "sync"
func main() {
    var wg sync.WaitGroup
    wg.Add(1)

    ch := make(chan int)
    go func() {
        for {
            foo, ok := <- ch
            if !ok {
                println("done")
                wg.Done()
                return
            }
            println(foo)
        }
    }()
    ch <- 1
    ch <- 2
    ch <- 3
    close(ch)

    wg.Wait()
}

原文由 laslowh 发布,翻译遵循 CC BY-SA 4.0 许可协议

通常,您将 goroutine 传递给一个(可能是独立的)信号通道。当您希望 goroutine 停止时,该信号通道用于推送一个值。 goroutine 定期轮询通道。一旦检测到信号,它就会退出。

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

// Do stuff

// Quit goroutine
quit <- true

原文由 jimt 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题