Skip to content

goroutine

goroutine 会被立刻放进可运行队列,等待调度

go 关键字只是把函数调用变成“异步调度任务”

可控

goroutine 泄漏

goroutine 泄漏 = goroutine 永远阻塞且没人再需要它,但它却无法退出。

一些泄漏例子:

go
func worker(ch chan int) {
    for {
        v := <-ch  // 如果没人再写,这里永远卡住
        fmt.Println(v)
    }
}
go
go func() {
    for {
        // select 没有退出条件
        select {
        case <-ch:
        }
    }
}()
go
go func() {
    // HTTP 请求里忘记 context
    time.Sleep(10 * time.Second)
}()
go
for {
    select {
    // 高 QPS 下 ,会有很多 chan,多到超过物理机能够承受的范围,从而出现异常或者泄漏
    case <-time.After(time.Second):
        // 解决方案,使用 time.NewTicker
    }
}

所有 goroutine 都要“可控”

  • 谁创建它?
  • 谁停止它?
  • 它什么时候退出?