首页 >后端开发 >Golang >如何有效地终止 Go 中的 Goroutine?

如何有效地终止 Go 中的 Goroutine?

DDD
DDD原创
2024-10-30 13:15:03814浏览

How do you effectively terminate a Goroutine in Go?

在 Go 中终止 Goroutine

使用 Go 例程时,了解如何有效终止它们变得至关重要。考虑以下设置:

<code class="go">func startsMain() {
    go main()
}

func stopMain() {
    // TODO: Kill main
}

func main() {
    // Infinite loop
}</code>

此设置在名为 main 的 goroutine 中创建一个无限循环。要终止循环,我们需要一种方法来从 stopMain 控制 Goroutine。

解决方案:使用 Channel 和 select

杀死 Goroutine 的一种有效方法是通过 Channel 和 select 语句。

<code class="go">var quit chan struct{}

func startLoop() {
    quit := make(chan struct{})
    go loop(quit)
}

func stopLoop() {
    close(quit)
}

func loop(quit chan struct{}) {
    for {
        select {
        case <-quit:
            return
        default:
            // Do stuff
        }
    }
}</code>

在此示例中,我们使用名为 quit 的零大小通道(chan struct{})来指示 goroutine 停止。 Loop 函数使用 select 语句重复检查退出通道。当 quit 收到一个值(表示停止请求)时,循环退出。

其他并发模式

Go 提供了额外的并发模式来处理 goroutine。请访问 Go 博客,了解有关这些模式的更多见解。

使用计时器

要定期执行函数,同时避免 CPU 耗尽,您可以使用代码。

<code class="go">import "time"

// [...]

func loop() {
    ticker := time.NewTicker(2 * time.Second)
    defer ticker.Stop()
    for {
        select {
        case <-quit:
            return
        case <-ticker.C:
            // Do stuff
        }
    }
}</code>

在这种情况下,选择块,直到 quit 接收到值或股票触发,从而允许该函数以指定的时间间隔执行。

以上是如何有效地终止 Go 中的 Goroutine?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn