非同期で処理する必要がある URL のリストを操作する場合、多くの場合、同時実行 Go ルーチンの数を制限することが望ましいです。リソースの過大化を防ぎます。解決策には、同時に実行できるゴルーチンの最大数を制御する制限付きチャネルを作成することが含まれます。
元の試行では、並列サイズのバッファリングされたチャネルが作成されました。
<code class="go">results := make(chan string, *parallel)</code>
その目的は、結果チャネルがいっぱいになったときに、チャネルから値が読み取られるまでプログラムをブロックし、別の goroutine を生成できるようにすることでした。ただし、このアプローチでは、すべての URL が処理されたときにメイン プログラムがブロックされないため、ゴルーチンの数が効果的に制限されません。
より効果的な解決策には、修正プログラムを作成することが含まれます。ワーカーゴルーチンの数:
<code class="go">for i := 0; i < *parallel; i++ { wg.Add(1) go func() { defer wg.Done() for url := range urls { worker(url, client, results) } }() }</code>
このソリューションでは、ゴルーチンはチャネルから URL を取得して処理する役割を果たします。チャネルにはフィーダ ゴルーチンから URL が供給され、すべての URL が取得されると、フィーダ ゴルーチンはチャネルを閉じ、ワーカーにタスクを終了するよう通知します。
別のゴルーチンがワーカーの完了ステータスを監視します。 goroutines、すべてのワーカーが完了したら結果チャネルを閉じます。このアプローチは、実行中のゴルーチンの数を指定された並列数に効果的に制限します。
以上がチャネルとの同時実行 Go ルーチンを効果的に制限するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。