KING 博主等级

一帆风顺 ⛵️⛵️⛵️

Go

什么是 Goroutine? 如何停止它

钟晓川
2023-12-18 / 0 点赞 / 1949 阅读

Goroutine(Go 协程)是 Go 语言中的轻量级线程。它们由 Go 运行时环境(runtime)管理,可以在单个线程内同时运行多个 Goroutine,而不需要手动管理线程的生命周期。Goroutine 能够高效地利用系统资源,并且具有很低的开销,可以方便地实现并发编程。

要停止一个 Goroutine,可以通过使用 Go 语言提供的一些机制来实现

使用通道(Channels)进行停止信号的传递

通过通道可以向 Goroutine 发送信号,告知它退出。

func myGoroutine(stopCh chan struct{}) {
    for {
        select {
        case <-stopCh:
            return // 通过接收到的信号退出 Goroutine
        default:
            // 执行 Goroutine 的工作
        }
    }
}

func main() {
    stopCh := make(chan struct{})
    go myGoroutine(stopCh)

    // 停止 Goroutine
    close(stopCh)
    // 或者发送一个停止信号
    // stopCh <- struct{}{}
}

使用 context 包

context 包提供了在 Goroutine 之间传递取消信号的方法

import "context"

func myGoroutine(ctx context.Context) {
    for {
        select {
        case <-ctx.Done():
            return // 收到取消信号时退出 Goroutine
        default:
            // 执行 Goroutine 的工作
        }
    }
}

func main() {
    ctx, cancel := context.WithCancel(context.Background())
    defer cancel() // 延迟取消

    go myGoroutine(ctx)

    // 停止 Goroutine
    cancel()
}

这些方法都可以有效地向 Goroutine 发送停止信号并安全地停止它们的执行。选择合适的方法取决于具体的应用场景和需求。

0