2 回答
TA贡献1875条经验 获得超3个赞
使用context.Context指示 go 例程中止其功能。当然,Go 例程必须侦听此类取消事件。
因此,对于您的代码,请执行以下操作:
ctx := req.Context() // this will be implicitly canceled by your TimeoutHandler after 1s
i := 0
for {
if i == 500 {
break
}
// for any long wait (1s etc.) always check the state of your context
select {
case <-time.After(1 * time.Second): // no cancelation, so keep going
case <-ctx.Done():
fmt.Println("request context has been canceled:", ctx.Err())
return // terminates go-routine
}
i++
}
注意: Context
被设计为链式的 - 允许以级联方式取消多个级别的子任务。
在典型的 REST 调用中,我们会发起数据库请求。因此,为了确保此类阻塞和/或缓慢的调用及时完成,不应使用Query ,而应使用QueryContext - 将 http 请求的上下文作为第一个参数传递。
TA贡献1794条经验 获得超8个赞
我发现,如果你没有任何方法到达你的频道,那么当 goroutine 运行时就没有办法杀死或停止它。
在大型计算任务中,您必须在特定时间间隔或特定任务完成后观看通道。
- 2 回答
- 0 关注
- 145 浏览
添加回答
举报