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)
}