Go 言語でゴルーチンの数を制限する方法
Goroutine の数を制限するには、バッファ付きチャネルを使用できます。手順は次のとおりです。
- バッファ容量を制限するコルーチンの数に指定された、バッファリングされたチャネルを作成する
maxGoroutine := 10
semaphore := make(chan struct{}, maxGoroutine)
- コルーチン開始時に、チャネル送信操作を使ってチャネルに信号を送信しようとする。チャネルがいっぱいになっている場合は、空きが出るまで現在のコルーチンをブロックする。
go func() {
// 尝试向通道发送信号,如果通道已满则阻塞当前协程
semaphore <- struct{}{}
defer func() {
// 协程结束后从通道释放一个空位
<-semaphore
}()
// 协程的具体逻辑
// ...
}()
- この方式では、同時に実行されるコルーチン数が制限を超えないようにすることができます。すべてのルーチンが終了すると、プログラムは終了します。
留意事項:
- チャンネルを使用するときは、データの送信と受信のタイミングに気を付けることで、デッドロックを回避できます。
- ルーチン終了時に他のルーチンの実行を再開するために空きスロットを解放します。
- 用途に応じてチャンネルの容量を調整して、異なるシナリオに対応することができます。