gpt4 book ai didi

http - 我优雅的停止 http.ListenAndServe 失败

转载 作者:数据小太阳 更新时间:2023-10-29 03:11:07 25 4
gpt4 key购买 nike

我是一名新手 Go 程序员。

我正在编写一个 Web 应用程序,我需要服务器在关闭之前等到发出事件请求。

我写了一个等待 5 秒回答的处理程序。如果我发出请求并停止服务器(在 5 秒之前),我会收到“无法连接”错误。

有一种方法可以停止监听新请求并等待事件请求完成吗?

这里是我的例子

func main() {
log.Infof("Starting (PID %d)...", os.Getpid())

stop := make(chan os.Signal, 1)
signal.Notify(stop, syscall.SIGTERM)
signal.Notify(stop, syscall.SIGINT)

listenAt := "127.0.0.1:8000"

r := newRouter()
h := &http.Server{Addr: listenAt, Handler: r}

go func() {
log.Info("Serving on http://", listenAt)

if err := h.ListenAndServe(); err != nil {
log.Fatal(err)
}
}()
<-stop

log.Info("Stoping ...")
h.Shutdown(context.Background())
log.Info("Bye :)")
}

示例处理程序

func handler(w http.ResponseWriter, r *http.Request) {
time.Sleep(5 * time.Second)
log.Info("new request")
fmt.Fprintf(w, "Hola!")
}

完整示例@ https://gist.github.com/nachopro/d80fa71ae49527e1ddcaf359b4ff488b

最佳答案

多亏了这个blog entry和他们的例子我发现这个 issue和他们的 solution .我看到我的问题与 net/http 模块无关!

真正的问题是go func()里面的log.Fatal(err),改成log.Info(err)不会中止关机过程。

go func() {
log.Info("Serving on http://", listenAt)

if err := h.ListenAndServe(); err != nil {
// log.Fatal(err)
log.Info(err)
}
}()

关于http - 我优雅的停止 http.ListenAndServe 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51579812/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com