首页 > 后端开发 > Golang > Go Goroutine 超时后如何取消执行?

Go Goroutine 超时后如何取消执行?

Susan Sarandon
发布: 2024-12-16 18:56:15
原创
330 人浏览过

How to Cancel a Go Goroutine's Execution After a Timeout?

超时取消 Goroutine 执行

在 Go 例程中,可能需要在超过特定时间阈值后终止操作。这可能会带来挑战,因为 Go 通常异步运行 goroutine,而无法直接控制其执行。使用 iris 框架时会出现一种常见情况,您可能会遇到 goroutine 即使在超时后仍继续执行的情况。

考虑以下代码片段:

package main

import (
    "fmt"
    "time"
)

func main() {
    Res := make(chan Response, 1)

    go func() {
        time.Sleep(10 * time.Second)
        fmt.Println("test")
        Res <- Response{data: "data", status: true}
    }()

    select {
    case <-Res:
        fmt.Println("Read from ch")
        res := <-Res
        fmt.Println(res.data, res.status)
    case <-time.After(50 * time.Millisecond):
        fmt.Println("Timed out")
    }
}

type Response struct {
    data   interface{}
    status bool
}
登录后复制

如图所示在示例中,在 10 秒延迟后启动一个 goroutine 来打印测试。通道(Res)用于促进 Goroutine 和主 Goroutine 之间的通信。 select 语句用于等待 goroutine 的响应或等待 50 毫秒的超时。

但是,预期的行为是一旦超时发生,goroutine 应立即终止。相反,输出显示即使超时已过,仍会打印 test。

出现这种情况是因为 Go 中没有简单的方法来强制中断正在运行的 goroutine 的执行。 Go 在 fork-join 并发模型上运行,其中新的 goroutine 作为单独的执行线程创建。一旦创建,goroutine 的调度和处理就成为 Go 运行时责任的一部分。

为了解决这个问题,建议采用同步技术,以便对 goroutine 行为进行更精细的控制。

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

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