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