go控制并发数
package main
import (
"fmt"
"sync"
"time"
)
//import ...
type Glimit struct {
n int
c chan struct{}
}
// initialization Glimit struct
func New_workers(max_goroutine int) *Glimit {
return &Glimit{
n: max_goroutine,
c: make(chan struct{}, max_goroutine),
}
}
// Run f in a new goroutine but with limit.
func (g *Glimit) Run(f func()) {
g.c <- struct{}{}
go func() {
f()
<-g.c
}()
}
var wg = sync.WaitGroup{}
func main() {
number := 8
g := New_workers(3) //定义一次最多使用3个并发
for i := 0; i < number; i++ {
wg.Add(1)
value := i //value只在for循环体里有效
//在循环里定义每次要执行的函数
goFunc := func() {
// 做一些业务逻辑处理
fmt.Printf("go func: %d %v\n", value, time.Now())
time.Sleep(time.Second)
wg.Done()
}
g.Run(goFunc)
}
wg.Wait() //等待结束
fmt.Println("ALL DONE !")
}
/*
输出 :
go func: 2 2022-06-27 16:13:57.9310717 +0800 CST m=+0.001639501
go func: 0 2022-06-27 16:13:57.9310717 +0800 CST m=+0.001639501
go func: 1 2022-06-27 16:13:57.9310717 +0800 CST m=+0.001639501
go func: 3 2022-06-27 16:13:58.940678 +0800 CST m=+1.011245801
go func: 4 2022-06-27 16:13:58.940678 +0800 CST m=+1.011245801
go func: 5 2022-06-27 16:13:58.940678 +0800 CST m=+1.011245801
go func: 7 2022-06-27 16:13:59.9415 +0800 CST m=+2.012067801
go func: 6 2022-06-27 16:13:59.9415 +0800 CST m=+2.012067801
ALL DONE !
*/
因为是并发,所以每次输出顺序可能不同,但是func: 0-7 都会执行。