使用 Iris 框架在超时时停止 Goroutine 执行
在使用 Goroutine 时,如果超过某个值,通常需要停止它们的执行时限。然而,一个常见的问题是,即使发生超时,goroutines 仍会继续执行。
为了解决这个问题,使用了以下代码片段:
import ( "fmt" "time" "github.com/kataras/iris/v12" ) type Response struct { data interface{} status bool } func (s *CicService) Find() (interface{}, bool) { ch := make(chan Response, 1) go func() { time.Sleep(10 * time.Second) fmt.Println("test") fmt.Println("test1") ch <- Response{data: "data", status: true} }() select { case <-ch: fmt.Println("Read from ch") res := <-ch return res.data, res.status case <-time.After(50 * time.Millisecond): return "Timed out", false } }
这个如果超过 50 毫秒的超时,代码会利用缓冲通道和 select 语句尝试终止 Goroutine。然而,“Timed out”的预期输出并未实现。相反,输出包括超时消息以及随后的“test”和“test1”打印输出。
要理解为什么会发生这种情况,重要的是要考虑 Go 中 goroutine 的行为。在 Go 中,没有有效的方法来强制停止正在运行的 goroutine。相反,必须使用通道和互斥锁等同步机制。
代码中使用的超时是通道接收操作的超时,而不是 goroutine 本身的超时。因此,即使接收操作超时,发送到通道的 Goroutine 也会继续执行,从而产生后续的打印输出。
在这种情况下,有必要在 Goroutine 之间实现某种形式的同步性。这可能涉及使用信号通道或上下文将超时传达给正在执行长时间运行任务的 goroutine,使其能够优雅地处理取消。
通过了解 Go 中 goroutine 执行的限制,采用适当的同步技术,可以在超时时有效地停止 goroutine。
以上是如何在 Iris 框架中优雅地停止超时的 Goroutine 执行?的详细内容。更多信息请关注PHP中文网其他相关文章!