“waitGroup”在使用 goroutines 时非常重要,因为当我们需要等待所有 goroutines 完成时,它会帮助我们。

“waitGroup”帮助我们使用 goroutines 使用的 fork-join 模型,因为主线程一直等待,直到在 fork 中执行的进程再次加入主线程。

“waitGroup”定义了四个方法来帮助我们控制“生命周期”,add()、wait()、done() 和 state()。让我们描述每一个:

  • add(int)

用于指示/添加所有 goroutine 到等待组。添加 goroutines 主线程将等待直到所有关闭它们通过调用 done() 完成。

  • wait()

用于在代码中指示流程正在等待 goroutines 结束。

  • done()

用于表示goroutine逻辑完成。

  • state()

State 返回指向存储在 wg.state* 中的 state 和 sema 字段的指针。 —(取自 golang 文档)


所有这些方法如何相互交互?

  • 因此,当我们向“waitGroup”添加一个 goroutine 时,我们必须确保使用 done() 终止它,换句话说,我们需要将我们指示的相同数量的 goroutine 标记为“Done()” “Add()”如果我们不这样做,代码会因为“致命错误:所有 goroutine 都处于睡眠状态——死锁!”而恐慌。

  • 调用“Wait()”方法后定义的代码将被执行,直到所有的 goroutines 完成。

  • 如果没有调用等待,那么“waitGroup”中的所有 goroutine 将在一个单独的进程中异步执行。

现在让我们举一个例子来看看“waitGroup”的作用。

在下面的示例中,我们将执行三个 goroutine。然后在第 13 行中,我们将它们添加到“waitGroup”中,为了模拟一个过程,我们只是添加了一个 time sleep,在这个例子中,每个 goroutine 都不同,我这样做是为了向你展示时间无关紧要需要完成的 goroutine,waitGroup 将停止流程,直到所有 goroutine 都“完成”。

输出:

好的! 我们完成了 waitGroup 的使用。