golang 并发控制
用channel控制协程数量
在 Golang 中,可以使用各种方法来控制并发并限制 goroutine 的数量。以下是一种可能的实现方式,可以最多同时运行 50 个 goroutine:
package main
import (
"sync"
)
func main() {
maxConcurrency := 50
taskCount := 100
var wg sync.WaitGroup
semaphore := make(chan struct{}, maxConcurrency)
for i := 0; i < taskCount; i++ {
wg.Add(1)
go func(taskID int) {
semaphore <- struct{}{} // 占用一个信号量,限制并发数量
// 执行你的任务代码
// ...
<-semaphore // 释放信号量
wg.Done()
}(i)
}
wg.Wait()
}
在上面的示例中,使用了一个 sync.WaitGroup 来等待所有任务完成。通过创建一个有容量的 chan struct{},我们可以使用带缓冲的通道作为信号量来控制 goroutine 的数量。maxConcurrency 变量定义了最大并发数量。
在每个 goroutine 中,首先会占用一个信号量(通过将空结构体写入通道),这将限制并发数量。然后在任务完成后释放信号量(通过从通道读取一个值)。sync.WaitGroup 用于等待所有任务完成。
请注意,这只是一种示例实现方式,您可以根据实际需求和情况进行适当的调整和修改。确保在使用并发控制时遵循最佳实践,以避免竞态条件和其他并发问题。