通过Channel控制并发数

Posted by mingo on 2020-06-13 22:44

概述

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) // 防止闭包引用错误
}

方法二

待补充

参考