golang限制协程并发数

使用带缓冲的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
}

zed
请先登录后发表评论
  • latest comments
  • 总共0条评论