📜  如何暂停当前 Goroutine 的执行?(1)

📅  最后修改于: 2023-12-03 14:53:07.871000             🧑  作者: Mango

如何暂停当前 Goroutine 的执行?

在Go语言中,有一些方法可以暂停当前 Goroutine 的执行。

方法一:使用 time.Sleep() 函数

使用 time.Sleep() 函数可以让当前 Goroutine 睡眠一段时间后再继续执行。这个函数的参数是一个时间段(Duration),可以是纳秒、微秒、毫秒、秒等等。例如,下面的代码将会暂停执行 1 秒钟:

import "time"

func main() {
    fmt.Println("开始执行")
    time.Sleep(1 * time.Second)
    fmt.Println("暂停 1 秒钟后继续执行")
}
方法二:使用 chan 管道

使用 chan 管道可以实现 Goroutine 之间的通信,可以通过一个 chan 管道来控制另一个 Goroutine 的执行。例如,下面的代码将会创建一个双向的、缓冲大小为 1 的 chan 管道,然后将其传给一个新的 Goroutine,使其暂停执行:

import "fmt"

func main() {
    fmt.Println("开始执行")
    ch := make(chan bool, 1)
    go func() {
        <-ch // 等待 chan 管道被发送数据
        fmt.Println("收到信号,暂停执行")
    }()
    ch <- true // 发送数据到 chan 管道
    fmt.Println("数据已发送")
}
方法三:使用 sync 包

使用 sync 包可以实现 Goroutine 之间的同步,可以通过一个 mutex 或 cond 条件变量来控制 Goroutine 的执行。例如,下面的代码将会创建一个互斥锁 mutex,然后对其进行加锁和释放操作,使其暂停执行:

import "fmt"
import "sync"

func main() {
    fmt.Println("开始执行")
    var mutex sync.Mutex
    mutex.Lock() // 加锁
    go func() {
        mutex.Lock() // 等待锁被释放
        fmt.Println("锁已释放,暂停执行")
    }()
    mutex.Unlock() // 释放锁
    fmt.Println("锁已释放")
}

这些方法各有优缺点,具体使用应根据实际需求来选择。