go - 使用多个 goroutine 的好处
问题描述
我见过等待一组 goroutine 完成的代码:
var wg sync.WaitGroup
wg.Add(2)
go func() {
// Do work.
wg.Done()
}()
go func() {
// Do some other work.
wg.Done()
}()
wg.Wait()
这样做的主要好处是什么,而不是让我们说:
var wg sync.WaitGroup
wg.Add(1)
go func() {
// Do work.
// Do some more work here instead.
wg.Done()
}()
wg.Wait()
它更快吗?
解决方案
有些事情要清楚:你的两个例子都使用一个sync.WaitGroup
,主要区别是工作的“分布”到goroutines。
在您的第一个示例中,您有 2 个并发的 goroutine 执行 2 个不同的工作(任务),而在第二个示例中,您有 1 个单独的 goroutine 依次执行这两个任务,一个接一个。
主要好处可能是2 个 goroutine 可以安排在 2 个 OS 线程中运行,这可能会利用 2 个独立的 CPU 内核,因此它可以更早/更快地完成。它是否提前完成以及完成多少取决于实际任务。
这两个任务甚至可能相互依赖,所以如果你把它们放在一个 goroutine 上,它们可能永远不会完成。
推荐阅读
- apache - Apache 2 - 从同一个 Apache 服务器部署 Angular-SPA 和 WSGI (Django) 应用程序
- python - pcolor 绘制翻转数组
- mongodb - MongoDB 多字段 $lookup 性能
- java - 仅使用一个分号在 Java 中旋转 int 数组
- java - JAVA:对链表中相邻的重复值进行排序
- c - 递归调用c创建链接列表
- azure - 从 Azure for Students 迁移到随用随付
- mysql - 如何修复“错误:MySQL 意外关闭。”?
- flutter - 在对象参数更改时构建子项
- javascript - 如何将geojson的LangLat坐标反转为LatLang,以便我可以使用它在传单js中绘制多边形?