Go语言中的等待方式详解-如果你想让程序等待-它允许你让当前协程暂停执行一段指定的时间

Go语言中的等待方式详解

一、使用 `time.Sleep`

函数是Go语言中最简单的等待方式之一。它允许你让当前协程暂停执行一段指定的时间。

比如,如果你想让程序等待2秒钟,可以这样写:

time.Sleep(2  time.Second)

这种方法虽然简单,但只适用于需要固定等待时间的场景。

二、使用 `sync.WaitGroup`

是Go语言标准库中的一个同步原语,用于等待一组协程完成。

下面是一个简单的例子:

var wg sync.WaitGroup
wg.Add(1)
go func() {
    defer wg.Done()
    // 模拟协程工作
    time.Sleep(1  time.Second)
}()
wg.Wait()

在这个例子中,`wg.Add(1)`增加了等待组的计数,每个协程完成时通过`wg.Done()`减少计数,主协程会阻塞,直到计数变为0。

三、使用 `context.Context`

提供了一种控制协程生命周期的方式,可以在指定的超时时间或取消信号触发时终止协程。

以下是一个创建自动取消的上下文并运行协程的例子:

ctx, cancel := context.WithTimeout(context.Background(), 3time.Second)
defer cancel()
go func() {
    // 所有工作协程都在这个上下文中运行
    // 如果上下文被取消,协程会停止工作
}()

四、使用 `time.After`

是另一种实现等待的方式,它返回一个通道,在指定的时间后会发送一个值。

下面是一个例子:

after := time.After(2  time.Second)
select {
case <-after:
    // 2秒后这里会执行
case <-time.After(5  time.Second):
    // 如果在5秒内没有从通道接收到值,这里会执行
}

五、使用 `sync.Mutex` 和 `sync.Cond`

和可以用来实现更复杂的等待和通知机制。

以下是一个使用 `sync.Mutex` 和 `sync.Cond` 的例子:

mu := &sync.Mutex{}
cond := sync.NewCond(mu)
mu.Lock()
// ...
cond.Wait() // 等待条件满足
mu.Unlock()

根据具体需求选择合适的等待方式,可以提高程序的健壮性和可读性。

方法 适用场景
使用 `time.Sleep` 简单的固定等待时间
使用 `sync.WaitGroup` 等待一组协程完成
使用 `context.Context` 控制协程生命周期
使用 `time.After` 指定时间后的操作
使用 `sync.Mutex` 和 `sync.Cond` 复杂的等待和通知机制

对于复杂的并发控制,推荐使用 `sync.WaitGroup` 和 `context.Context`,因为它们提供了更高的灵活性和可控性。