使用带缓冲的channel控制协程并发数
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
}
 
                
最新评论