“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 的使用。