如何暂停当前 Goroutine 的执行?


作为一名 Go 开发人员,您可能需要在某些时候暂停 Goroutine 的执行。暂停 Goroutine 在某些场景中非常有用,例如等待用户输入、等待服务器响应或防止竞争条件。

在本文中,我们将探讨在 Go 中暂停当前 Goroutine 执行的各种方法。

方法 1:使用 time.Sleep()

暂停 Goroutine 执行最简单的方法是使用 time.Sleep() 函数。此函数以持续时间作为参数,并在给定持续时间内暂停 Goroutine 的执行。

示例

以下是一个示例 -

package main

import (
   "fmt"
   "time"
)

func main() {
   fmt.Println("Start")
   time.Sleep(5 * time.Second)
   fmt.Println("End")
}

输出

Start
End

方法 2:使用 sync.WaitGroup

暂停 Goroutine 执行的另一种方法是使用 sync.WaitGroup。当您希望在继续执行之前等待一组 Goroutine 完成执行时,此方法非常有用。

示例

以下是一个示例 -

package main

import (
   "sync"
)

func main() {
   var wg sync.WaitGroup
   wg.Add(1)

   go func() {
      defer wg.Done()
      // Do some work
   }()

   wg.Wait()
   // Continue after all Goroutines finish their execution
}

在上面的示例中,主 Goroutine 使用 wg.Wait() 方法等待匿名函数内的 Goroutine 完成其执行。

方法 3:使用通道

通道也可用于暂停 Goroutine 的执行。您可以向通道发送一个值,并在 Goroutine 接收该值之前等待,然后继续执行。

示例

以下是一个示例 -

package main

import (
   "fmt"
)
   
func main() {
   c := make(chan bool)
   
   go func() {
      // Do some work
      c <- true
   }()
   
   <-c // Wait for the Goroutine to send the value
   // Continue after the Goroutine sends the value
   fmt.Println("Goroutine finished")
}

在上面的示例中,主 Goroutine 等待匿名函数内的 Goroutine 从通道接收值,然后继续执行。

输出

Goroutine finished

结论

暂停当前 Goroutine 的执行在各种场景中都很有帮助。在本文中,我们探讨了三种不同的暂停 Goroutine 执行的方法,包括使用 time.Sleep()、sync.WaitGroup 和通道。每种方法都有其优缺点,您应该选择最适合您的用例的方法。

更新于: 2023年4月25日

1K+ 阅读量

启动您的 职业生涯

通过完成课程获得认证

立即开始
广告