模拟一下协程数量太多的危害:
func main() {
number := math.MaxInt64
for i := 0; i < number; i++ {
go func(i int) {
// 做一些业务逻辑处理
fmt.Printf("go func: %d\n", i)
time.Sleep(time.Second)
}(i)
}
number过大,服务器系统资源利用率不断上涨,到最后程序自动killed
协程池解决?
池化要解决的问题①是频繁创建的开销,②是在等待时占用的资源。
goroutine没必要协程池!原因如下:
- goroutine 和普通线程相比,创建和调度都不需要进入内核,也就是创建的开销已经解决了。同时
- 相比系统线程,内存占用也是轻量的。所以池化技术要解决的问题goroutine 都不存在