内容纲要
背景
项目开发时,在某些业务场景我们可能需要控制服务的并发数量,不想引入比较复杂的协程池,只想简单实现。下面我们就可以利用channel特性,几行代码搞定这个需求!
代码实现
package main
import (
"fmt"
"time"
)
var (
sig chan struct{}
poolSize = 3 // 用来控制同步并发大小
)
func init() {
sig = make(chan struct{}, poolSize)
}
func simplePool() {
select {
case sig <- struct{}{}: // 写入成功说明管道中有多余空闲位置
break
default: // 说明管道已经满了
fmt.Println("busy")
return
}
defer func() { <-sig }() // 函数执行完成后消费管道中的一个数据,给其余协成继续使用的机会
// todo something
fmt.Println("ok")
}
func main() {
for i := 0; i < 10; i++ {
go simplePool()
}
time.Sleep(2 * time.Second)
}
说明
以上如果只算上有效代码的话仅仅十来行,写法简单,所适应的场景也很明确:用来简单的控制协程的并发
。
之所以说它简单,是因为它不能像真正的协程池那样避免协程的创建和销毁这两步操作,如果需要功能完善的可以参考:github.com/panjf2000/ants
文章评论