我有一个goroutine,它调用一个方法,并在一个通道上传递返回值:
ch := make(chan int, 100)
go func(){
for {
ch <- do_stuff()
}
}()我如何阻止这样的goroutine?
发布于 2011-11-12 03:19:12
EDIT:我匆忙写了这个答案,然后才意识到你的问题是关于将值发送到goroutine中的chan。下面的方法既可以使用上面建议的附加chan,也可以使用您已经拥有的chan是双向的,您可以只使用其中的一个。
如果您的goroutine仅用于处理从chan传出的项,则可以使用"close“内置函数和通道的特殊接收表单。
也就是说,一旦你在chan上发送完项目,你就关闭它。然后,在goroutine中,您将获得接收操作符的一个额外参数,该参数显示通道是否已关闭。
下面是一个完整的示例( waitgroup用于确保该过程继续,直到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()
}发布于 2011-07-24 23:39:25
通常,您向goroutine传递一个(可能是单独的)信号通道。当您希望goroutine停止时,该信号通道用于将一个值推入。goroutine定期对该频道进行民意调查。一旦检测到信号,它就会退出。
quit := make(chan bool)
go func() {
for {
select {
case <- quit:
return
default:
// Do other stuff
}
}
}()
// Do stuff
// Quit goroutine
quit <- true发布于 2011-07-28 15:40:52
你不能从外面杀死一只大猩猩。您可以向goroutine发出停止使用通道的信号,但是goroutine上没有句柄来执行任何类型的元管理。Goroutines的目的是合作解决问题,所以杀死一个行为不端的人几乎永远不会是一个足够的反应。如果您想要隔离以获得健壮性,那么您可能需要一个进程。
https://stackoverflow.com/questions/6807590
复制相似问题