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