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 都会执行。