这个 goroutine 是如何失败的?

func serveApp() {

    mux := http.NewServeMux()

    mux.HandleFunc("/", func(resp http.ResponseWriter, req *http.Request) {

        fmt.Fprintln(resp, "Hello, QCon!")

    })

    http.ListenAndServe("0.0.0.0:8080", mux)

}


func serveDebug() {

    http.ListenAndServe("127.0.0.1:8001", http.DefaultServeMux)

}


func main() {

    go serveDebug()

    serveApp()

}

但是,serveDebug 在单独的 goroutine 中运行,如果它只返回该 goroutine 将退出,而程序的其余部分继续运行。您的操作人员会不高兴地发现他们无法在需要时从您的应用程序中获取统计信息,因为 /debug 处理程序很久以前就停止了工作。


我是 Golang 和一般编码的新手。我在网上看到一篇文章,找到了这段代码。我将它复制并粘贴到我的编辑器中,然后输入go run main.go。该程序永远运行,没有任何错误。我可以毫无问题地卷曲它。为什么代码不好?我是一个菜鸟,我正在努力更好地理解这一点,如果这可以用简单的术语来解释,那就太好了。


PIPIONE
浏览 98回答 1
1回答

手掌心

该程序创建两个 HTTP 服务器来响应接收到不同端口的流量。调试服务器在单独的 goroutine 中运行,无法检测该服务器是否发生故障。该程序可能会继续与应用服务器一起运行服务。如果其中一个失败,更好的实现是停止两台服务器:stop:=make(chan struct{},2)go func() {&nbsp; &nbsp; defer func() {&nbsp; &nbsp; &nbsp; &nbsp; stop<-struct{}{}&nbsp; &nbsp; }()&nbsp; &nbsp; serveDebug()}()go func() {&nbsp; &nbsp; defer func() {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;stop <-struct{}{}&nbsp; &nbsp; }{}&nbsp; &nbsp; serveApp()}()<-stop上面,程序将创建两个 goroutines 并阻塞<-stop直到有人写入通道。如果任何一个服务器发生故障,goroutine 将写入通道,该通道将解除阻塞<-stop,因此程序将退出。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go