什么是 Goroutine?你如何停止它?

发布于 1周前 作者 h691938207 最后一次编辑是 5天前 来自 问答

什么是 Goroutine?你如何停止它?

一个 Goroutine 是一个函数或方法执行同时旁边其他任何够程采用了特殊的 Goroutine 线程。Goroutine 线程比标准线程更轻量级,大多数 Golang 程序 同时使用数千个 Goroutine。

要创建 Goroutine,请 go 在函数声明之前添加关键字。

go f(x, y, z)

您可以通过向 Goroutine 发送一个信号通道来停止它。Goroutines 只能在被 告知检查时响应信号,因此您需要在逻辑位置(例如 for 循环顶部)包含检查。 Goroutine示例代码如下:

package main  func main() {
quit := make(chan bool) go func() {
for {
select {
case <-quit:
return default:
// … }
}
}()
// …
quit <- true }
1 回复

什么是 Goroutine?

Goroutine 是 Go 语言中的一个并发体,它比线程更轻量级,由 Go 运行时(runtime)管理。Goroutine 的调度是由 Go 的运行时系统处理的,这使得创建成千上万的 Goroutine 成为可能,而不需要担心传统的线程创建和销毁所带来的开销。Goroutine 的设计使得编写并发程序变得更加简单和高效。

示例代码:

package main

import (
    "fmt"
    "time"
)

func say(s string) {
    for i := 0; i < 5; i++ {
        time.Sleep(100 * time.Millisecond)
        fmt.Println(s)
    }
}

func main() {
    go say("world") // 在新的 Goroutine 中执行 say 函数
    say("hello")    // 在当前 Goroutine 中执行
}

如何停止 Goroutine?

由于 Goroutine 是由 Go 运行时直接管理的,并没有直接的方法来“停止”一个 Goroutine。不过,你可以通过几种方式间接地控制或停止 Goroutine 的执行:

  1. 使用通道(Channel)进行通信:通过发送信号(如关闭通道或发送特定值)到 Goroutine 监听的通道,让 Goroutine 内部根据接收到的信号来决定是否继续执行。

  2. 使用上下文(Context)context.Context 类型用于在不同 Goroutine 之间传递取消信号、超时时间和截止日期等。它是 Go 标准库推荐的用于控制并发操作的方法。

示例代码:使用通道停止 Goroutine

package main

import (
    "fmt"
    "time"
)

func worker(done chan bool) {
    fmt.Println("Working...")
    time.Sleep(time.Second)
    fmt.Println("Done")

    // 检查通道是否已关闭或接收到信号
    <-done
}

func main() {
    done := make(chan bool, 1)
    go worker(done)

    time.Sleep(time.Millisecond * 500) // 假设我们决定在0.5秒后停止 worker
    close(done) // 关闭通道以通知 worker 停止

    // 注意:这里我们没有等待 worker 完成,因为它在接收到关闭的通道时会立即退出。
    // 如果需要等待,可以在关闭通道后,使用 sync.WaitGroup 或其他机制来等待。
}

注意:在这个例子中,我们只是简单地通过关闭通道来“通知”worker函数可以停止了。但是,如果worker函数中有循环或其他长时间运行的操作,它应该检查通道的状态(比如是否关闭或接收到特定的值),以决定是否继续执行。在实际应用中,可能需要更复杂的逻辑来处理各种并发场景。

回到顶部