以下内容转载自 https://blog.youkuaiyun.com/stronglyh/article/details/80557825
当在中间件或处理程序中启动新的GORDUTIN时,不应该在其内部使用原始上下文,必须使用只读副本。
func main() {
r := gin.Default()
r.GET("/long_async", func(c *gin.Context) {
// 创建要在goroutine中使用的副本
cCp := c.Copy()
go func() {
// simulate a long task with time.Sleep(). 5 seconds
time.Sleep(5 * time.Second)
// 这里使用你创建的副本
log.Println("Done! in path " + cCp.Request.URL.Path)
}()
})
r.GET("/long_sync", func(c *gin.Context) {
// simulate a long task with time.Sleep(). 5 seconds
time.Sleep(5 * time.Second)
// 这里没有使用goroutine,所以不用使用副本
log.Println("Done! in path " + c.Request.URL.Path)
})
// Listen and serve on 0.0.0.0:8080
r.Run(":8080")
}
本文介绍在Gin框架中如何正确地在Goroutine内使用上下文的副本,避免因直接使用原始上下文而导致的问题。通过示例代码展示了在同步与异步处理中上下文使用的方法。
900

被折叠的 条评论
为什么被折叠?



