【go并发控制】一卷旌收千骑虏,万全身出百重围。这篇文章主要讲述go并发控制相关的知识,希望能为你提供帮助。
Get到一个并发数量控制的办法
package main
import (
"fmt"
"sync"
"time"
)type GoLimit struct {
cchan struct{}
wg *sync.WaitGroup
}func NewGoLimit(maxSize int) *GoLimit {
return &
GoLimit{
c:make(chan struct{}, maxSize),
wg: new(sync.WaitGroup),
}
}func (g *GoLimit) Add(delta int) {
g.wg.Add(delta)
for i := 0;
i <
delta;
i++ {
g.c <
- struct{}{}
}
}func (g *GoLimit) Done() {
<
-g.c
g.wg.Done()
}func (s *GoLimit) Wait() {
s.wg.Wait()
}var golimit = NewGoLimit(50)func main() {
userCount := 100
for i := 0;
i <
userCount;
i++ {
go Read(i)
}golimit.Wait()
}func Read(i int) {
defer golimit.Done()
golimit.Add(1)fmt.Printf("go func: %d, time: %d\\n", i, time.Now().Unix())
time.Sleep(time.Second)
}
推荐阅读
- 遵循CIS Docker Benchmarks规范的开源巡检脚本(内附PDF下载)
- HarmonyOS实战——CommonDialog组件的基本使用
- 第三周
- uni-app技术分享|开源demo视频呼叫arcall uni-app端技术实现
- 使用docker-compose部署最新版Harbor v2.3.2
- LINUX随笔三 tomcat日志显示中文乱码
- 程序员突破内卷大法(聊聊软件架构师成长之路(干货系列,说人话接地气))
- Divi全屏滑块错误
- 显示CPT每个分类的最新帖子