本文转载自微信公众号:labuladong
举个具体的例子,最近再往 B 站上搬运 YouTube 的优质算法视频,但是手动下载太麻烦,干脆直接写个并发程序给我打工算了。以下是非并发版本的 main 函数中的主要部分:
func main() {
urls := exec.GetUrls()
for i := 0; i < len(urls); i++ {
// 下载操作,较耗时
exec.DownloadVideos(urls[i])
}
}
这段代码应该很好理解,一个一个下载。但是我想最大化利用网速,改成并发。你可能想这样写:
func main() {
urls := exec.GetUrls()
for i := 0; i < len(urls); i++ {
go exec.DownloadVideos(urls[i])
}
}
不行,回想刚才 sleep

本文介绍了如何将串行任务改为并发执行,并提出了三种限制并行度的方法:1) 主动控制分身数量;2) 使用带缓冲的channel限制并发;3) 利用range持续抢任务。这些策略能有效利用系统资源,避免过度并行导致的效率降低。
最低0.47元/天 解锁文章
3638

被折叠的 条评论
为什么被折叠?



