Go 控制协程(goroutine)的并发数量
在Go中,可以使用runtime
包中的GOMAXPROCS
函数来设置程序可以使用的处理器核心数。但是,这并不能控制协程的并发数量。控制协程并发的数量,通常使用sync.WaitGroup
或者通道(channel)来实现。
以下是一个使用通道来控制协程并发数量的示例代码:
package main
import (
"fmt"
"sync"
"sync/atomic"
"time"
)
var (
concurrency = 5 // 最大并发数
limit = make(chan struct{}, concurrency) // 通道限制并发数
wg sync.WaitGroup
count int32 // 原子操作计数
)
func worker(id int) {
defer wg.Done()
// 添加到通道,开始工作
limit <- struct{}{}
// 模拟工作时间
time.Sleep(1 * time.Second)
// 打印信息
fmt.Printf("Worker %d done\n", id)
// 工作完成,从通道移除
<-limit
// 原子操作增加计数
atomic.AddInt32(&count, 1)
}
func main() {
for i := 0; i < 10; i++ {
wg.Add(1)
go worker(i)
}
wg.Wait() // 等待所有工作结束
fmt.Printf("Finished with %d workers\n", count)
}
在这个例子中,我们创建了一个大小为concurrency
的通道limit
,用来控制同时执行的协程数量。每个工作协程在通过limit
之前会被阻塞,当通道中已经有concurrency
数量的项时,更多的协程会处于等待状态。每个工作协程完成后,会从通道中移除一个项,这样其他等待的协程就可以开始工作了。
这个例子中,我们限制了最大并发数为5,并且等待所有工作协程完成后,打印出最终完成的工作数量。
评论已关闭