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 都要“可控”
- 谁创建它?
- 谁停止它?
- 它什么时候退出?