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

什么是 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函数中有循环或其他长时间运行的操作,它应该检查通道的状态(比如是否关闭或接收到特定的值),以决定是否继续执行。在实际应用中,可能需要更复杂的逻辑来处理各种并发场景。

回到顶部