如何暂停当前 Goroutine 的执行
作为 Go 开发者,您可能需要在某个时间点暂停 Goroutine 的执行。暂停 Goroutine 可在等待用户输入、等待来自服务器的响应或防止竞态条件等情况下非常有用。
本文将探讨 Go 中暂停当前 Goroutine 执行的各种方法。
方法1:使用 time.Sleep()
暂停 Goroutine 执行的最简单方法是使用 time.Sleep() 函数。此函数以一个持续时间作为参数并暂停 Goroutine 的执行直到给定的持续时间。
示例
以下是一个示例-
package main
import (
"fmt"
"time"
)
func main() {
fmt.Println("开始")
time.Sleep(5 * time.Second)
fmt.Println("结束")
}
输出
开始
结束
方法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()
// 做一些工作
}()
wg.Wait()
// 所有 Goroutine 执行完毕后继续执行
}
在上面的示例中,主 Goroutine 使用 wg.Wait() 方法等待匿名函数内部的 Goroutine 完成其执行。
方法3:使用 Channels
Channels 也可用于暂停 Goroutine 的执行。您可以发送值到通道并等待 Goroutine 接收到它后继续执行。
示例
以下是一个示例-
package main
import (
"fmt"
)
func main() {
c := make(chan bool)
go func() {
// 做一些工作
c <- true
}()
<-c // 等待 Goroutine 发送值
// Goroutine 发送值后继续执行
fmt.Println("Goroutine 已完成")
}
在上面的示例中,主 Goroutine 等待匿名函数内部的 Goroutine 接收到通道值后继续执行。
输出
Goroutine 已完成
结论
暂停当前 Goroutine 的执行在各种情况下都非常有用。在本文中,我们探讨了三种不同的暂停 Goroutine 执行的方法,包括使用 time.Sleep()、sync.WaitGroup 和 Channels。每种方法都有其优点和缺点,您应选择最适合您用例的方法。