最近在工作中使用 golang 编程,因为语言内置对并发的支持(go 关键字),所以 golang 越来越受到服务端开发的青睐。今天的文章给大家分享一下 go 并发编程中一个比较隐晦的 bug --- goroutine 泄漏。
注意本文不是 golang 语法的科普贴,如果对 golang channel、go、error 等基础语法不了解的话,推荐大家先去看一下 《go 语言圣经》。
在日常的开发场景中,我们经常可以将一个大任务分解成多个互相独立、可以相互并行(无前后依赖)的小任务。一旦完成了对任务的分解,我们就可以使用并发/并行技术,加速我们的程序。假设现有:
func Task() error {
// 调度各个 sub-task 等待其结束
return nil
}
func SubTaskA() error {
// 略
return nil
}
func SubTaskB() error {
// 略
return nil
}
func SubTaskC() error {
// 略
return nil
}
这些 SubTask 可以独立于其他 SubTask 自己运行。那在 go 中通过下面的代码实现自任务的并发处理:
func Task() error {
go SubTaskA()
go SubTaskB()
go SubTaskC()
return nil
}
简单的一个关键字 go,就实现了多个 subroutine 的并发调度,这里真的不得不感慨 golang 对并发的友好。
上面的代码固然实现了