在Go语言中,可以使用`sync.WaitGroup`和`chan`来限制最大并发数。
- 使用`sync.WaitGroup`:`sync.WaitGroup`是一个计数器,用来等待一组goroutine完成任务。可以在每个goroutine开始执行前调用`Add()`方法增加计数器,然后在goroutine执行结束时调用`Done()`方法减少计数器,最后可以调用`Wait()`方法等待所有的goroutine完成。
以下是一个使用`sync.WaitGroup`限制最大并发数的示例代码:
package main
import (
"fmt"
"sync"
"time"
)
func main() {
// 设置最大并发数为3
maxConcurrency := 3
// 创建一个等待组
var wg sync.WaitGroup
// 创建一个通道用于控制最大并发数
sem := make(chan struct{}, maxConcurrency)
// 创建10个任务
for i := 0; i < 10; i++ {
wg.Add(1)
// 将任务添加到通道中
sem <- struct{}{}
go func(i int) {
// 执行任务
fmt.Println("Task", i, "start")
time.Sleep(time.Second)
fmt.Println("Task", i, "done")
// 任务完成后从通道中移除
<-sem
// 完成任务
wg.Done()
}(i)
}
// 等待所有任务完成
wg.Wait()
}
- 使用`chan`:`chan`是Go语言中的通道,可以用来进行goroutine之间的通信。通过创建一个指定缓冲大小的通道,可以限制最大并发数。
以下是一个使用`chan`限制最大并发数的示例代码:
package main
import (
"fmt"
"time"
)
func main() {
// 设置最大并发数为3
maxConcurrency := 3
// 创建一个通道用于控制最大并发数
sem := make(chan struct{}, maxConcurrency)
// 创建10个任务
for i := 0; i < 10; i++ {
// 将任务添加到通道中
sem <- struct{}{}
go func(i int) {
// 执行任务
fmt.Println("Task", i, "start")
time.Sleep(time.Second)
fmt.Println("Task", i, "done")
// 任务完成后从通道中移除
<-sem
}(i)
}
// 等待所有任务完成
for i := 0; i < maxConcurrency; i++ {
sem <- struct{}{}
}
}
这样可以确保同一时间最多同时执行maxConcurrency个goroutine。