golang 并发(1) --- goroutine 泄漏

本文探讨了Go语言并发编程中的goroutine泄漏问题,指出无缓冲channel可能导致goroutine阻塞,进而引发资源无法回收的状况。文章通过示例代码解释了错误做法,并提出两种解决方案:使用带缓冲的channel或启动channel drainer。了解这些有助于避免goroutine泄漏,确保服务端程序的稳定运行。
摘要由CSDN通过智能技术生成

 

最近在工作中使用 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 对并发的友好。

上面的代码固然实现了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值