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...)(代码片段

[Go] 并发和并行的区别

更简的并发代码,更强的并发控制

go并发控制

Go语言:sync包控制并发详解!

Go并发控制--context的使用