Go 服务器在发送 INT 信号后挂起
Go server hangs after sending INT signal
代码如下:
package main
import (
"log"
_ "net/http/pprof"
"fmt"
"net/http"
"html"
"os/signal"
"os"
)
func main() {
//INT signal handling
c := make(chan os.Signal, 1)
signal.Notify(c, os.Interrupt)
go func() {
for range c {
log.Println("GOT SIGNAL!")
return
}
}()
//INT signal handling
http.HandleFunc("/bar", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello, %q", html.EscapeString(r.URL.Path))
})
log.Fatal(http.ListenAndServe(":8080", nil))
}
按下 CTRL-C 后挂起(服务器继续工作)。但是如果你在 "INT signal handling" 之间评论块,它就完成了。
你能解释一下这种行为吗?很明显,http 服务器可以在单独的 goroutine 中显式创建和启动,并在那里优雅地终止。但总的来说,问题是如何解释这段代码的行为,如果有处理 SIGNTERM 的新通道,为什么 http 不会停止。
谢谢!
在您的 INT 处理程序中,您不会自己退出程序。
如果您为 INT 安装信号处理程序,则程序在收到 Ctrl+C 时的默认行为(即退出程序)不会完成。相反,程序现在通过调用您的 INT 处理程序代码来处理它,因此如果您想退出程序,请在循环中调用 os.Exit(0)
。
代码如下:
package main
import (
"log"
_ "net/http/pprof"
"fmt"
"net/http"
"html"
"os/signal"
"os"
)
func main() {
//INT signal handling
c := make(chan os.Signal, 1)
signal.Notify(c, os.Interrupt)
go func() {
for range c {
log.Println("GOT SIGNAL!")
return
}
}()
//INT signal handling
http.HandleFunc("/bar", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello, %q", html.EscapeString(r.URL.Path))
})
log.Fatal(http.ListenAndServe(":8080", nil))
}
按下 CTRL-C 后挂起(服务器继续工作)。但是如果你在 "INT signal handling" 之间评论块,它就完成了。 你能解释一下这种行为吗?很明显,http 服务器可以在单独的 goroutine 中显式创建和启动,并在那里优雅地终止。但总的来说,问题是如何解释这段代码的行为,如果有处理 SIGNTERM 的新通道,为什么 http 不会停止。 谢谢!
在您的 INT 处理程序中,您不会自己退出程序。
如果您为 INT 安装信号处理程序,则程序在收到 Ctrl+C 时的默认行为(即退出程序)不会完成。相反,程序现在通过调用您的 INT 处理程序代码来处理它,因此如果您想退出程序,请在循环中调用 os.Exit(0)
。