Как обработчик остановки golang gin сразу работает, если соединение потеряно
Я использую gin-gonic / gin для написания своего сервера.
Кажется, даже если соединение потеряно, функция-обработчик все еще работает. Например, если я захожу на сайт http://127.0.0.1:8080/ping и неожиданно закрываю браузер, на экране будут продолжать печататься все числа.
package main
import (
"github.com/gin-gonic/gin"
"log"
"time"
)
func main() {
r := gin.Default()
r.GET("/ping", func(c *gin.Context) {
for i := 1; i < 15; i++ {
time.Sleep(time.Second * 1)
log.Println(i)
}
c.JSON(200, gin.H{
"message": "pong",
})
})
r.Run("127.0.0.1:8080")
}
Как мне немедленно остановить функцию обработчика (например, чтобы уменьшить нагрузку на сервер)?
1 ответ
Решение
Контекст запроса отменяется, когда клиент отключается, поэтому просто проверьте, готов ли c.Done() к приему:
package main
import (
"log"
"time"
"github.com/gin-gonic/gin"
)
func main() {
r := gin.Default()
r.GET("/ping", func(c *gin.Context) {
t := time.NewTicker(1 * time.Second)
defer t.Stop()
for i := 1; i < 15; i++ {
select {
case <-t.C:
log.Println(i)
case <-c.Request.Context().Done():
// client gave up
return
}
}
c.JSON(200, gin.H{
"message": "pong",
})
})
r.Run("127.0.0.1:8080")
}