Обработчик тайм-аута перемещает выполнение ServeHTTP для новой процедуры, но не может уничтожить эту процедуру после окончания таймера.При каждом запросе создается две подпрограммы, но подпрограммы ServeHTTP никогда не уничтожаются с помощью контекста.
Не удается найти способ уничтожения подпрограмм.
Редактировать Цикл For сФункция time.Sleep, представляет огромные вычисления, которые выходят за рамки нашего таймера.Может заменить его любой другой функцией.
package main
import (
"fmt"
"io"
"net/http"
"runtime"
"time"
)
type api struct{}
func (a api) ServeHTTP(w http.ResponseWriter, req *http.Request) {
// For-loop block represents huge computation and usually takes more time
// Can replace with any code
i := 0
for {
if i == 500 {
break
}
fmt.Printf("#goroutines: %d\n", runtime.NumGoroutine())
time.Sleep(1 * time.Second)
i++
}
_, _ = io.WriteString(w, "Hello World!")
}
func main() {
var a api
s := http.NewServeMux()
s.Handle("/", a)
h := http.TimeoutHandler(s, 1*time.Second, `Timeout`)
fmt.Printf("#goroutines: %d\n", runtime.NumGoroutine())
_ = http.ListenAndServe(":8080", h)
}
Программа ServeHTTP должна завершать работу вместе с контекстом запроса, обычно это не происходит.