미들웨어 내부의 Go루틴
미들웨어 혹은 핸들러 내부에서 새로운 Go루틴을 시작하려면, 기존의 context를 사용해서는 안됩니다. 읽기 전용으로 복사해서 사용해야 합니다.
func main() {
r := gin.Default()
r.GET("/long_async", func(c *gin.Context) {
// Go루틴 내부에서 사용하기 위한 복사본을 작성합니다.
cCp := c.Copy()
go func() {
// time.Sleep()를 사용하여 장시간(5초) 작업을 시뮬레이션 합니다.
time.Sleep(5 * time.Second)
// 중요! 복사된 context인 "cCp"를 사용하세요.
log.Println("Done! in path " + cCp.Request.URL.Path)
}()
})
r.GET("/long_sync", func(c *gin.Context) {
// time.Sleep()를 사용하여 장시간(5초) 작업을 시뮬레이션 합니다.
time.Sleep(5 * time.Second)
// Go루틴을 사용하지 않는다면, context를 복사할 필요가 없습니다.
log.Println("Done! in path " + c.Request.URL.Path)
})
// 서버가 실행 되고 0.0.0.0:8080 에서 요청을 기다립니다.
r.Run(":8080")
}