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,会有问题

2年前 评论
讨论数量: 1

gin使用sync.Pool重用context,请求结束会将context放回对象池,供其他请求复用。异步任务不copy context的话,其他请求可能从对象池中拿到同一个context,会有问题

2年前 评论

gin使用sync.Pool重用context,请求结束会将context放回对象池,供其他请求复用。异步任务不copy context的话,其他请求可能从对象池中拿到同一个context,会有问题

2年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!