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

posted @ 2022-06-27 16:16  wsh3166Sir  阅读(169)  评论(6编辑  收藏  举报