Go 言語でゴルーチンの数を制限する方法

Goroutine の数を制限するには、バッファ付きチャネルを使用できます。手順は次のとおりです。

  1. バッファ容量を制限するコルーチンの数に指定された、バッファリングされたチャネルを作成する
maxGoroutine := 10
semaphore := make(chan struct{}, maxGoroutine)
  1. コルーチン開始時に、チャネル送信操作を使ってチャネルに信号を送信しようとする。チャネルがいっぱいになっている場合は、空きが出るまで現在のコルーチンをブロックする。
go func() {
    // 尝试向通道发送信号,如果通道已满则阻塞当前协程
    semaphore <- struct{}{}
    
    defer func() {
        // 协程结束后从通道释放一个空位
        <-semaphore
    }()
    
    // 协程的具体逻辑
    // ...
}()
  1. この方式では、同時に実行されるコルーチン数が制限を超えないようにすることができます。すべてのルーチンが終了すると、プログラムは終了します。

留意事項:

  1. チャンネルを使用するときは、データの送信と受信のタイミングに気を付けることで、デッドロックを回避できます。
  2. ルーチン終了時に他のルーチンの実行を再開するために空きスロットを解放します。
  3. 用途に応じてチャンネルの容量を調整して、異なるシナリオに対応することができます。
bannerAds