golangで最大同時実行数を制限する方法は?
Go言語では、sync.WaitGroupとchanを利用することで、最大同時接続数を制限できます。
- 同期待ちグループ
- sync.WaitGroup
- 追加
- 完了
- 待つ
以下は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 を使用してコンカレンシーを制限するサンプルコードを示します。
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{}{}
}
}
goroutineは最大maxConcurrency実行可能で同時に実行することができます。