Как обработчик остановки 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")
}

Как мне немедленно остановить функцию обработчика (например, чтобы уменьшить нагрузку на сервер)?


person qing6010    schedule 15.11.2018    source источник


Ответы (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")
}
person Peter    schedule 15.11.2018
comment
Я проверил код, но он все равно выводит все числа. - person qing6010; 16.11.2018
comment
Хорошо ... он работает, заменяя c.Done () на c.Request.Context (). Done () как из github.com/gin-gonic/gin/issues/1452. - person qing6010; 16.11.2018
comment
Прости за это. Я просто предположил, что контекст джина ведет себя как стандартный контекст запроса. Я обновил ответ. - person Peter; 16.11.2018