Goroutine の同時実行の制限
処理する URL のリストがあり、同時に実行される Goroutine の数を制限したいシナリオを考えてみましょう。 。たとえば、URL が 30 個ある場合、並行して動作するゴルーチンは 10 個のみとします。
提供されたコードは、サイズ Parallel のバッファリングされたチャネルを使用して、実行中のゴルーチンの数を制限しようとします。 。ただし、このアプローチでは、すべての URL を処理した後でもブロックされないようです。この同時実行制限を達成するより効果的な方法は、指定した数のワーカー ゴルーチンを作成し、専用チャネルを通じて URL をフィードすることです。
コードの改良版は次のとおりです。
<code class="go">parallel := flag.Int("parallel", 10, "max parallel requests allowed") flag.Parse() urls := flag.Args() // Create a channel to hold URLs that workers will consume workerURLChan := make(chan string) // Start a goroutine to feed URLs to the workers go func() { for _, u := range flag.Args() { workerURLChan <- u } // Once all URLs have been distributed, close the channel, which will cause workers to exit close(workerURLChan) }() var wg sync.WaitGroup client := rest.Client{} results := make(chan string) // Start the specified number of worker goroutines for i := 0; i < *parallel; i++ { wg.Add(1) go func() { defer wg.Done() // Workers repeatedly fetch URLs from the channel until it is closed for url := range workerURLChan { worker(url, client, results) } }() } // Close the results channel when all workers have completed, which will allow the main goroutine to exit go func() { wg.Wait() close(results) }() // Receive and print results from the worker goroutines for res := range results { fmt.Println(res) }</code>
この更新されたコードでは、許可された同時実行ごとにワーカー goroutine を作成し、これらのワーカーは専用チャネルから URL をフェッチします。すべての URL が配布されると、workerURLChan が閉じられ、現在の URL が完了するとワーカーが終了します。このメカニズムは、同時に実行される goroutine の数を効果的に制限します。
以上がGo での Goroutine の同時実行を制限するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。