goroutine 停止
在 Go 工程师的面试中,也绕不开他,会有人问 ”如何停止一个 goroutine?”,一下子就把话题范围扩大了,这是一个涉及多个知识点的话题,能进一步深入问。
为此,今天煎鱼就带大家了解一下停止 goroutine 的方法!
goroutine 案例
在日常的工作中,我们常会有这样的 Go 代码,go 关键字一把搜起一个 goroutine:
func main() {
ch := make(chan string, 6)
go func() {
for {
ch <- "脑子进煎鱼了"
}
}()
}
初入 goroutine 大门的开发者可能就完事了,但跑一段时间后,他就可能会遇到一些问题,苦苦排查...
像是:当 goroutine 内的任务,运行的太久,又或是卡死了...就会一直阻塞在系统中,变成 goroutine 泄露,或是间接造成资源暴涨,会带来许多的问题。
如何在停止 goroutine,就成了一门必修技能了,不懂就没法用好 goroutine。
关闭 channel
第一种方法,就是借助 channel 的 close 机制来完成对 goroutine 的精确控制。
代码如下:
func main() {
ch := make(chan string, 6)
go func() {
for {
v, ok := <-ch
if !ok {
fmt.Println("结束")
return
}
fmt.Println(v)
}
}()
ch <- "煎鱼还没进锅里..."
ch <- "煎鱼进脑子里了!"
close(ch)
time.Sleep(time.Second)
}
在 Go 语言的 channel 中,channel 接受数据有两种方法:
msg := <-ch
msg, ok := <-ch