- go 高并发
- 并发控制
- 性能和稳定性的平衡艺术
什么是并发处理的数量
大家理解一下Goroutine 协程为轻量级的线程。 就是可有并发处理逻辑的最小单元。 理解多个 协程同时并发处理逻辑只要
for i:=0 ; i<=n; i++ {
go func() {
// 并发处理的逻辑
}()
}
上面就是n个协程同时并发处理逻辑。 在go中非常方便!。
为什么要控制并发处理的协程数量
上面说了非常方便多开几个协程。那么问题来了,如果不控制并发数量。我们举个例子,并发使用网络登陆同一个ftp server. 那么很快就会超过限制。而出现问题。 简单点说就是控制一下最大并发处理的协程的数量
怎么控制并发数量
控制 Goroutine 的数量
先看不控制并发的方法
func main() {
jobsCount := 10
group := sync.WaitGroup{}
for i := 0; i < jobsCount; i++ {
group.Add(1)
go func(i int) {
defer group.Done() // defer 保证函数退出前执行
fmt.Printf("job %d!\n", i)
jobWork() // 这里是一个同步的长时间的方法就是job
}(i)
fmt.Printf("index: %d,goroutine Num: %d \n", i, runtime.NumGoroutine())
}
group.Wait()
fmt.Println("done!")
}
输出结果:
ndex: 0,goroutine Num: 2
index: 1,goroutine Num: 3
index: 2,goroutine Num: 4
index: 3,goroutine Num: 5
index: 4,goroutine Num: 6
index: 5,goroutine Num: 7
index: 6,goroutine Num: 8
index: 7,goroutine Num: 9
index: 8,goroutine Num: 10
index: 9,goroutine Num: 11
job 9
job 0!
job 1!
job 2!
job 3!
job 4!
job 5!
job 6!
job 7!
job 8!
done!