概述
golang开启一个协程是很方便的, 但是如果不加限制的开启协程, 可能会导致系统资源被占尽, 进而导致服务不可用
本文总结了常见的通过channel来控制并发数量的实现思路
方式一
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
var concurrency = 16 // 希望的控制并发数为16
var limit = make(chan int, concurrency)
for _, work := range works {
limit <- 1
go func(w) {
defer func() { // 防止process发生错误导致 limit 没有释放
<- limit
}()
defer func() { // 防止子协程panic导致主协程panic
if e := recover(); e != nil {
log(e)
}
}
process(w) // 真正业务处理
}(work) // 防止闭包引用错误
}
方法二
待补充