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

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

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-12-11 21:30:12969浏览

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中文网其他相关文章!

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