Использование TimeoutHandler для прекращения обработки запроса через 1 секунду на стороне сервера

Я просматривал этот документ, связанный с тайм-аутами и крайними сроками для HTTP-серверов в Go. Это хороший документ, но у меня есть один вопрос поhttp.TimeoutHandler.

      func slowHandler(w http.ResponseWriter, req *http.Request) {
    time.Sleep(10 * time.Second)
    log.Print("Slow API call done after 10 seconds")
    io.WriteString(w, "I am slow!\n")
}

func main() {
    srv := http.Server{
        Addr:         ":8888",
        WriteTimeout: 5 * time.Second,
        Handler:      http.TimeoutHandler(http.HandlerFunc(slowHandler), 1*time.Second, "Timeout!\n"),
    }

    if err := srv.ListenAndServe(); err != nil {
        fmt.Printf("Server failed: %s\n", err)
    }
}

В доке упоминается, что

Через секунду сработает наш TimeoutHandler, прекратит обработку slowHandler и вернет простое «Timeout!» сообщение

вывод запроса на скручивание:

      # time curl localhost:8888   
*   Trying 127.0.0.1:8888...
* TCP_NODELAY set
* Connected to localhost (127.0.0.1) port 8888 (#0)
> GET / HTTP/1.1
> Host: localhost:8888
> User-Agent: curl/7.68.0
> Accept: */*
> 
* Mark bundle as not supporting multiuse
< HTTP/1.1 503 Service Unavailable
< Date: Wed, 14 Dec 2022 10:19:15 GMT
< Content-Length: 9
< Content-Type: text/plain; charset=utf-8
< 
Timeout!
* Connection #0 to host localhost left intact
curl localhost:8888 -v  0.01s user 0.01s system 1% cpu 1.018 total

Действительно, ответ отправляется обратно через 1 сек.

Но я также заметил, что получил это сообщение в журналах сервера примерно через 10 секунд.

      2022/12/14 15:49:24 Slow API call done after 10 seconds

15:49:24 по Гринвичу будет 10:19:24

Итак, я предполагаю, что запрос все еще обрабатывался в фоновом режиме и не был отменен TimeoutHandler. Он все еще работал в фоновом режиме.

Я правильно это понимаю? А если так, то что будет, еслиslowHandlerимеет бесконечный цикл - что-то вроде этого?

      func slowHandler(w http.ResponseWriter, req *http.Request) {
    for {} //infinite loop
    log.Print("infinite loop")
    io.WriteString(w, "I am slow!\n")
}

Будет ли он работать вечно в фоновом режиме?

0 ответов

Другие вопросы по тегам