文章目录
- channel+waitGroup控制并发量
- 前言
- 示例
channel+waitGroup控制并发量
前言
- golang的goroutine非常轻量级,同时启动数万协程都没问题。
- 如果不对并发量进行控制,比如同时产生数百万的协程,会压垮服务器
- 通过控制channel缓冲区的大小,从而控制并发数
- waitGroup保证子协程都运行完成后主协程才退出
示例
产生了100个协程,控制并发数为10,可以看到用时10098ms
package main
import (
"fmt"
"sync"
"time"
)
// channel + WaitGroup实现控制并发数量
var maxConcurrentNum = 10
var chData = make(chan int, maxConcurrentNum)
var wg sync.WaitGroup
var taskNum = 100
func main() {
start_time := time.Now().UnixMilli()
for i := 0; i < taskNum; i++ {
chData <- 1
go doTask(i)
}
wg.Wait()
close(chData)
fmt.Println("Main over")
end_time := time.Now().UnixMilli()
fmt.Printf("Duration: %vms", end_time-start_time)
}
func doTask(taskID int) {
wg.Add(1)
time.Sleep(time.Millisecond * 1000)
fmt.Println("Finish task ", taskID)
<-chData
wg.Done()
}
调整并发数为50时,用时2032ms