发送INT信号后,服务器挂起

时间:2017-10-23 10:21:30

标签: multithreading go goroutine

以下是代码:

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信号处理"之间发表评论,它就会很好。 你能解释一下这种行为吗?很明显,http服务器可以在单独的goroutine中显式创建和启动,并在那里优雅地终止。但一般来说,问题是如何解释此代码中的行为剪断,如果有新的通道处理SIGNTERM,http为什么不会停止。 谢谢!

1 个答案:

答案 0 :(得分:1)

在你的INT处理程序中,你不要自己退出程序。

如果为INT安装信号处理程序,则在接收退出程序的Ctrl + C时,程序的默认行为不会完成。相反,程序现在通过调用INT处理程序代码来处理它,因此如果要退出程序,请在循环中调用os.Exit(0)