go并发控制
Posted luoguo
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了go并发控制相关的知识,希望对你有一定的参考价值。
Get到一个并发数量控制的办法
package main
import (
"fmt"
"sync"
"time"
)
type GoLimit struct {
c chan 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)
}
以上是关于go并发控制的主要内容,如果未能解决你的问题,请参考以下文章
全栈编程系列SpringBoot整合Shiro(含KickoutSessionControlFilter并发在线人数控制以及不生效问题配置启动异常No SecurityManager...)(代码片段