Golang 中的 WaitGroups 指南

Golang 中的 WaitGroups 指南

这个强大功能的简要说明

Photo by 谢苗鲍里索夫 on 不飞溅

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 版权协议,转载请附上原文出处链接和本声明

本文链接:https://www.qanswer.top/39828/43012911

posted @ 2022-09-29 11:44  哈哈哈来了啊啊啊  阅读(38)  评论(0编辑  收藏  举报