gin中在中间件或handler中使用goroutine

package main

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"log"
	"time"
)

func main() {
	// 当在中间件或handler启动新的goroutine时, 不能使用原始的上下文,必须使用只读的副本
	r := gin.Default()
	r.GET("/long_async", func(context *gin.Context) {
		// 创建在goroutine中使用的副本
		cpContext := context.Copy()
		go func() {
			time.Sleep(2 * time.Second)
			// 注意:使用的是复制的上下文cpContext,这一点很重要
			fmt.Println(cpContext.Request.URL.Path)
		}()
	})
	r.GET("/long_sync", func(context *gin.Context) {
		time.Sleep(2 * time.Second)
		// 因为没有使用goroutine,所以不需要拷贝上下文
		log.Println(context.Request.URL.Path)
	})
	r.Run()
}

 

在中间件中使用goroutine

func main() {
	// 在中间件中使用goroutine时,必须使用上下文的只读副本
	router := gin.Default()
	router.Use(func(context *gin.Context) {
		cpContext := context.Copy()
		go func() {
			log.Println("中间件执行了")
			log.Println(cpContext.Request.URL.Path)
		}()
	})
	router.GET("/json", func(context *gin.Context) {
		context.String(200, "OK")
	})
	router.Run()
}

 

 

posted @ 2021-10-26 13:59  专职  阅读(429)  评论(0编辑  收藏  举报