DEV Community 日本語 フォロー Goにおけるバウンド並列処理:ゴルーチンを制限するセマフォパターン Goプログラミング言語の並行処理モデルは、goroutineによって強力ですが、多数のgoroutineが同時に起動されると、下流のサービスを圧倒したり、システムリミットに達したりする問題を引き起こす可能性があります。これは、多数のURLを取得するようなI/Oバウンドなタスクでは特に顕著です。URLごとにgoroutineを起動するという一般的な初期アプローチは、ファイルディスクリプタのようなリソースを枯渇させたり、APIのレート制限をトリガーしたりする可能性があります。根本的な問題は、同時実行操作の数が制御されない、無制限のファンアウトです。これを解決するには、並行処理を制限する必要があります。効果的な方法の1つは、バッファ付きチャネルをカウンティングセマフォとして使用することです。チャネルへの送信はスロットの取得を意味し、受信は解放を意味します。より複雑なシナリオでは、重み付き並行処理制限とコンテキスト認識型の取得を可能にするx/sync/semaphoreパッケージを使用するアプローチがあります。エラー処理を伴い、失敗時に他の操作を停止する必要があるタスクには、SetLimitメソッドを備えたx/sync/errgroupパッケージが推奨されるソリューションです。errgroupは、エラーが発生したときにキャンセルされる派生コンテキストも提供し、他のgoroutineが正常に終了できるようにします。複数のgoroutineから個別のスライスインデックスに書き込むことは安全ですが、共有ミュータブル状態には同期が必要です。適切な並行処理制限ツールを選択することは、作業が均一であるか、エラー伝播が必要か、重み付き制限が必要かどうかに依存します。最適な並行処理制限は、CPU数ではなく、チェーン内の最も弱いリソース、多くの場合外部APIの許容範囲によって決定されます。制限された並列処理により、goroutine数は入力サイズではなくリソースに合わせてスケーリングされ、サービスのダウンタイムを防ぎます。 Bounded Parallelism in Go: The Semaphore Pattern That Caps Goroutines dev.to
x/sync/semaphoreパッケージを使用するアプローチがあります。エラー処理を伴い、失敗時に他の操作を停止する必要があるタスクには、SetLimitメソッドを備えたx/sync/errgroupパッケージが推奨されるソリューションです。errgroupは、エラーが発生したときにキャンセルされる派生コンテキストも提供し、他のgoroutineが正常に終了できるようにします。複数のgoroutineから個別のスライスインデックスに書き込むことは安全ですが、共有ミュータブル状態には同期が必要です。適切な並行処理制限ツールを選択することは、作業が均一であるか、エラー伝播が必要か、重み付き制限が必要かどうかに依存します。最適な並行処理制限は、CPU数ではなく、チェーン内の最も弱いリソース、多くの場合外部APIの許容範囲によって決定されます。制限された並列処理により、goroutine数は入力サイズではなくリソースに合わせてスケーリングされ、サービスのダウンタイムを防ぎます。