golang 多线程控制线程数量,防止使用go命令启动无限协程

库安装命令 go get github.com/msterzhang/gpool

size是任务数

package main

import (
	"fmt"
	"github.com/msterzhang/gpool"
)

func RunTest(i int,pool *gpool.Pool)  {
	fmt.Println(i)
	pool.Done()
}

func main()  {
	size:=2
	pool := gpool.New(size)
	for i:=1;i<=10;i++{
		pool.Add(1)
		go RunTest(i,pool)
	}
	pool.Wait()
}

下面是使用系统库实现的demo

//协程池

package main

import (
    "fmt"
    "sync"
    "time"
)

//协程池

type Pool struct {
    num int //go协程数
    ch chan struct{}//任务队列
}

//初始化协程池

func NewPool(num int) *Pool {
    return &Pool{
        num: num,
        ch: make(chan struct{},num),
    }
}


var wg sync.WaitGroup
//任务处理函数

func Task(p *Pool)  {
    p.ch<- struct{}{}
    wg.Add(1)
    go func() {
        //fmt.Println(time.Now())
        time.Sleep(1*time.Second)
        <-p.ch //一定要加,不取出会死锁
        wg.Done()
    }()
}

func main()  {
    //1.创建协程对象
    p:=NewPool(50)
    //2.创建任务
    bT := time.Now()            // 开始时间
    for i := 0; i <100 ; i++ {
        Task(p)
    }
    wg.Done()
    close(p.ch)
    eT := time.Since(bT)      // 从开始到当前所消耗的时间
    fmt.Println("Run time: ", eT)
}