Golang 限制并发数
在Golang中,你可以使用sync.WaitGroup
和chan
(通道)来限制并发数。以下是一个示例代码,它使用一个有界的通道来控制并发数:
package main
import (
"fmt"
"sync"
"time"
)
func main() {
concurrency := 3 // 你想要限制的并发数
var wg sync.WaitGroup
queue := make(chan struct{}, concurrency) // 创建一个有界通道
for i := 0; i < 10; i++ { // 模拟10个任务
wg.Add(1)
queue <- struct{}{} // 放入一个元素到通道,限制并发数
go func(id int) {
defer wg.Done()
defer func() { <-queue }() // 任务完成后从通道移除一个元素
// 模拟耗时操作
time.Sleep(time.Second)
fmt.Println("Task", id, "is running")
}(i)
}
wg.Wait() // 等待所有任务完成
}
在这个例子中,我们使用了一个sync.WaitGroup
来等待所有并发的goroutines完成,同时使用了一个chan struct{}
(无缓冲的通道)或者有缓冲的通道(如上例的queue
)来限制并发的数量。每个goroutine在启动前向通道中放入一个元素,执行完任务后再从通道中移除元素。这样可以确保同时运行的goroutines数量不会超过我们设定的限制。
评论已关闭