限制并发 Go 例程
在您的代码中,您尝试限制并发 goroutine 的数量。然而,当前的实现并没有按预期工作。这是另一种方法:
解决方案:
不要为每个 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>
说明:
这方法确保在任何给定时间最多有并行 goroutine 处于活动状态,从而根据需要限制并发性。
以上是如何有效限制Go例程并发?的详细内容。更多信息请关注PHP中文网其他相关文章!