限制并发 Goroutine 执行
考虑一个场景,您有一个要处理的 URL 列表,并且想要限制运行的并发 Goroutine 的数量。例如,如果你有 30 个 URL,你可能只需要 10 个 goroutine 并行工作。
提供的代码尝试使用大小为 parallel 的缓冲通道来限制运行的 goroutine 数量。然而,这种方法在处理完所有 URL 后似乎并没有阻塞。实现这种并发限制的更有效方法是创建指定数量的工作 goroutine 并通过专用通道向它们提供 URL。
这是代码的改进版本:
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 在此更新的代码中,我们为每个允许的并发执行创建一个工作协程,这些工作协程从专用通道获取 URL。一旦所有 URL 都已分发,workerURLChan 就会关闭,这会在当前 URL 完成时触发工作人员退出。这种机制有效地限制了并发运行的goroutines的数量。
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3