在中间件中使用 Goroutine

当在中间件或 handler 中启动新的 Goroutine 时,不能使用原始的上下文,必须使用只读副本。

  1. func main() {
  2. r := gin.Default()
  3. r.GET("/long_async", func(c *gin.Context) {
  4. // 创建在 goroutine 中使用的副本
  5. cCp := c.Copy()
  6. go func() {
  7. // 用 time.Sleep() 模拟一个长任务。
  8. time.Sleep(5 * time.Second)
  9. // 请注意您使用的是复制的上下文 "cCp",这一点很重要
  10. log.Println("Done! in path " + cCp.Request.URL.Path)
  11. }()
  12. })
  13. r.GET("/long_sync", func(c *gin.Context) {
  14. // 用 time.Sleep() 模拟一个长任务。
  15. time.Sleep(5 * time.Second)
  16. // 因为没有使用 goroutine,不需要拷贝上下文
  17. log.Println("Done! in path " + c.Request.URL.Path)
  18. })
  19. // 监听并在 0.0.0.0:8080 上启动服务
  20. r.Run(":8080")
  21. }