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

如何优雅地终止 Go 中的 Goroutine?

Mary-Kate Olsen
发布: 2024-10-29 17:22:02
原创
730 人浏览过

How to Gracefully Terminate a Goroutine in Go?

优雅地终止 Goroutine

在 Go 中,goroutine 提供并发性,允许多个任务同时执行。有时,有必要终止一个 goroutine,例如当我们需要优雅地关闭一个应用程序时。

考虑以下代码:

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

func stopMain() {
    //kill main
}

func main() {
    //infinite loop
}</code>
登录后复制

在这种情况下,主 goroutine 运行无限循环,我们希望在 stopMain 函数中停止它。我们如何实现这一目标?

解决方案在于使用通道在 goroutine 之间进行通信。这是一个改进的代码片段:

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

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

func stopLoop() {
    close(quit)
}

// BTW, you cannot call your function main, it is reserved
func loop() {
    for {
        select {
        case <-quit:
            return // better than break
        default:
            // do stuff. I'd call a function, for clarity:
            do_stuff()
        }
    }
}</code>
登录后复制

我们引入了一个struct{}类型的退出通道,它可以保存一个空的结构体值。

  • 在startLoop中,我们初始化退出
  • 在 stopLoop 中,我们关闭退出通道,向循环 goroutine 发送信号以停止。
  • 在循环 goroutine 中,我们使用带有默认情况的 select 来连续检查来自退出通道的信号。当收到信号时,循环会优雅地退出。

这种机制允许我们通过退出通道向 goroutine 发送信号来优雅地终止无限循环。

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

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板