package main
import (
"fmt"
"sync"
"time"
)
//使用带缓冲的channel控制协程并发数
func main() {
a := []int{1, 2, 3, 4, 5, 6}
limit := 2 //指定最大并发数
goLimit := make(chan bool, limit)
var wg sync.WaitGroup
for _, value := range a {
wg.Add(1) //主goroutine等待+1
goLimit <- true //写入通道达到最大值会阻塞
go func(value int, goLimit chan bool) {
defer func(goLimit chan bool) {
<-goLimit //取出通道的值
wg.Done() //主goroutine等待-1
}(goLimit)
time.Sleep(1 * time.Second) //模拟程序执行时长
fmt.Println("value =", value)
}(value, goLimit)
}
wg.Wait() //wg为0,所有goroutine实行完毕,阻塞释放
fmt.Println("程序执行完成")
}
//也可以封装成结构体,然后import导入调用
type GoLimit struct {
ch chan bool
}
//限制最大协程并发数
func limitGo(limitNum int) *GoLimit {
return &GoLimit{make(chan bool, limitNum)}
}
//写入通道
func (GoLimit *GoLimit) Add() {
GoLimit.ch <- true
}
//从通道取出,腾出一个空间
func (GoLimit *GoLimit) Done() {
GoLimit.ch <- true
}
最新评论