gpt4 book ai didi

http - 如何结合使用 defer 和 http.ListenAndServe?

转载 作者:IT王子 更新时间:2023-10-29 01:51:00 26 4
gpt4 key购买 nike

在 Go 中使用 http.ListenAndServe() 时,这会导致阻塞情况,显然,应用程序只能通过终止它来停止。这似乎跳过了处理我的 defer 语句。请看下面的代码。当我终止应用程序时,数据库没有关闭。如何确保我的 defer 语句将运行?

func main() {
db := NewDB(DBFILENAME)
defer db.Close()
http.HandleFunc("/", handler)
http.ListenAndServe(":80", nil)
}

最佳答案

defer 语句只有在包含它们的函数返回时才会执行。当你杀死它时,你的主要功能不会返回。所以你需要使用信号和 channel 。

这是一个解释相同内容的好链接 https://www.socketloop.com/tutorials/golang-intercept-ctrl-c-interrupt-or-kill-signal-and-determine-the-signal-type .

我在上一个项目中遇到了同样的问题。我在我的项目中实现了类似的解决方案 wshare .

在你的情况下,你可以尝试类似的东西

     ch := make(chan os.Signal, 3)

signal.Notify(ch, os.Interrupt,syscall.SIGTERM,syscall.SIGINT)


go func() {
signalType := <-ch
signal.Stop(ch)
log.Println("Exit command received. Exiting...")

// this is a good place to flush everything to disk
// before terminating.
db.Close()
log.Println("Signal type : ", signalType)

os.Exit(0)

}()

关于http - 如何结合使用 defer 和 http.ListenAndServe?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41594137/

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