Использование 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")
}
Будет ли он работать вечно в фоновом режиме?