Golang 中的 WaitGroups 指南
Golang 中的 WaitGroups 指南
这个强大功能的简要说明
Goroutines 是很好用的工具,但是它们有一个问题。在这篇文章中,我们将调查这个问题,我们将看到 WaitGroups 如何帮助我们解决这个问题。
我们将编写代码来抓取网站并记录它们的状态代码。
同步示例
当你运行下面的代码时,每个站点都会被一个一个地爬取。也就是说,要爬取github.com,代码需要等到medium.com爬完。它不是最佳代码。我们将利用 goroutines 使这段代码更快。
使用 goroutine
我们可以使用 goroutine 使代码更快。每个站点都会被异步爬取,因此代码不必等待medium.com被爬取来爬取github.com。
当您运行下面的代码时,您将创建四个新的 goroutine。但是当你运行这段代码时,你不会看到任何输出,因为你创建了 15 到 17 行 goroutines。然后主函数退出,因此进程被销毁,因此您的所有 goroutine 在完成工作之前都被销毁,因为主 goroutine 不知道它需要等待其他 goroutine 完成。
等待组帮助
一个 等待组
等待 goroutine 完成。让我们逐行检查代码,看看发生了什么。
- 第 17 行——我们说我们有四个 goroutines 等待,所以
等待组
将使计数器增加4
. (我们说四个 goroutine 是因为我们已经知道要抓取四个网站,我们将为每个网站创建一个 goroutine。) - 第 19 行——我们为每个要爬取的网站启动一个新的 goroutine。
- 第 20 行——我们给我们的反馈
等待组
goroutine 完成了。所以它将计数器减一。 - 第 24 行——这一行阻塞了主 goroutine,直到四个 goroutine 中的每一个都说它们完成了。它阻塞直到计数器变为零,然后主函数存在。
如果计数器没有变为零,
_wg.Wait 块_
将永远持续下去。
如果计数器变为负数,它会恐慌。
通过指针
如果您需要转机 等待组
例如,您需要通过指针传递它。否则,它将复制我们在第 10 行创建的实例,所以当我们说 wg.完成
在第 25 行。它不会减少实例的计数器 wg.等待
等待。所以第 10 行实例的计数器将保持不变 4
所以 wg.等待
将永远阻止它,并且计数器仍然存在 4
.
感谢您的阅读。请继续关注更多。
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明