首页 > 后端开发 > Golang > Go中如何在超时后正确停止Goroutine的执行?

Go中如何在超时后正确停止Goroutine的执行?

Mary-Kate Olsen
发布: 2024-12-11 21:30:12
原创
1091 人浏览过

How Can I Properly Stop a Goroutine's Execution After a Timeout in Go?

Go 中通过超时停止 Goroutine 执行

当尝试在超时时终止 Goroutine 执行时,可能会显得无效。这是因为 Go 的并发模型按照 fork-join 原理运行,其中启动 goroutine(fork)并不能立即控制其执行。仅在同步点(例如通道通信)重新获得控制权。

在给定的示例中:

go func() {
    time.Sleep(10 * time.Second)
    fmt.Println("test")
    fmt.Println("test1")
    ch <- Response{data: "data", status: true}
}()
登录后复制

尽管设置了超时,但 goroutine 仍继续执行:

case <-time.After(50 * time.Millisecond):
    return "Timed out", false
登录后复制

这是因为超时与通道的接收者(阅读器)有关,而不是发送者。由于通道被缓冲,发送方可以继续执行而不会中断。

为了实现所需的行为,必须采用同步技术。例如,通道可以在超时时关闭以防止进一步通信:

select {
case <-ch:
    fmt.Println("Read from ch")
    res := <-ch
    return res.data, res.status
case <-time.After(50 * time.Millisecond):
    close(ch)
    return "Timed out", false
}
登录后复制

以上是Go中如何在超时后正确停止Goroutine的执行?的详细内容。更多信息请关注PHP中文网其他相关文章!

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