同時 Go ルーチンの制限
コード内で、同時 Go ルーチンの数を制限しようとします。ただし、現在の実装は意図したとおりに機能しません。別のアプローチは次のとおりです。
解決策:
URL ごとに goroutine を作成する代わりに、共有チャネルから URL を処理する固定数のワーカーを作成します。変更されたコードは次のとおりです:
<code class="go">parallel := flag.Int("parallel", 10, "max parallel requests allowed") flag.Parse() // Workers get URLs from this channel urls := make(chan string) // Feed the workers with URLs go func() { for _, u := range flag.Args() { urls <- u } // Workers will exit from range loop when channel is closed close(urls) }() var wg sync.WaitGroup client := rest.Client{} results := make(chan string) // Start the specified number of workers. for i := 0; i < *parallel; i++ { wg.Add(1) go func() { defer wg.Done() for url := range urls { worker(url, client, results) } }() } // When workers are done, close results so that main will exit. go func() { wg.Wait() close(results) }() for res := range results { fmt.Println(res) }</code>
説明:
これこのアプローチでは、常に最大数の並列ゴルーチンがアクティブになり、必要に応じて同時実行性が制限されます。
以上が同時実行の Go ルーチンを効果的に制限するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。