频繁的创建和销毁goroutine带来的开销不仅仅是goroutine创建和销毁本身.
更大的开销是由于goroutine的Stack一开始只有2KB, 而大部分复杂的业务都需要更多的Stack.
新创建goroutine, 还需要付出频繁扩展Stack的成本. 这个成本是巨大的.
如果最终需要128KB的栈,那么要扩6次stack. 期间需要复制和检查Stack当中的数据, 开销巨大.
以下的代码,可以把创建goroutine改成一个简单的入chan操作, 同时也避免的扩展Stack的操作, 成本就降低了很多.
var resolvers chan func()
func init() {
resolvers = make(chan func(), 100)
var f func()
f = func() {
defer f()
j := <-resolvers
j()
}
for i := 0; i < 100; i++ {
go f()
}
}
使用的代码如下:
resolvers <- func() {
L(xxxx) // 这里是示意代码
}
----------------
我的博客即将搬运同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan