Да, я думаю, что без поддержки пакета http, постепенное отключение невозможно. Это может быть немного менее требовательно, но все равно закроет любые другие параллельные запросы в полете во время этого запроса. Возможно, попробуйте отправить запрос на функцию отслеживания проблем Go . А еще лучше, откройте пакет http, добавьте метод корректного завершения работы и отправьте его .
Редактировать: Полагаю, если вы контролируете все http.Handlers в своем приложении, вы можете сохранить количество запросов в полете (используя соответствующую синхронизацию потоков) и изменить приведенный ниже код, чтобы ) отказаться от новых подключений после вызова «shutdown» и b) дождаться завершения всех запросов в полете, прежде чем завершить работу ...
package main
import (
"http"
"os"
"io"
"log"
"strconv"
)
func main() {
http.HandleFunc("/", ServeHTTP)
http.ListenAndServe(":8081", nil)
}
const responseString = "Shutting down\n"
func ServeHTTP(w http.ResponseWriter, req *http.Request) {
w.Header().Set("Content-Type", "text/plain; charset=utf-8")
w.Header().Set("Content-Length", strconv.Itoa(len(responseString)))
io.WriteString(w, responseString)
f, canFlush := w.(http.Flusher)
if canFlush {
f.Flush()
}
conn, _, err := w.(http.Hijacker).Hijack()
if err != nil {
log.Fatalf("error while shutting down: %v", err)
}
conn.Close()
log.Println("Shutting down")
os.Exit(0)
}