gin 中使用 goroutine 时为什么要使用副本?
1. 运行环境
go 1.7
2. 问题描述?
请问各位大神,gin 中使用 goroutine 时为什么要使用副本?跪求解答,非常感谢!!!
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使用sync.Pool重用context,请求结束会将context放回对象池,供其他请求复用。异步任务不copy context的话,其他请求可能从对象池中拿到同一个context,会有问题