限制并发 Goroutine 执行
考虑一个场景,您有一个要处理的 URL 列表,并且想要限制运行的并发 Goroutine 的数量。例如,如果您有 30 个 URL,您可能只需要 10 个并行工作的 goroutine。
提供的代码尝试使用大小为 parallel 的缓冲通道来限制运行的 goroutine 数量。然而,这种方法在处理完所有 URL 后似乎并没有阻塞。实现此并发限制的更有效方法是创建指定数量的工作 goroutine 并通过专用通道向它们提供 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>
在此更新的代码中,我们为每个允许的并发执行创建一个工作协程,这些工作协程从专用通道获取 URL。一旦所有 URL 都已分发,workerURLChan 就会关闭,这会在当前 URL 完成时触发工作人员退出。这种机制有效限制了并发运行的 goroutine 数量。
以上是Go 中如何限制 Goroutine 并发执行?的详细内容。更多信息请关注PHP中文网其他相关文章!