繁体   English   中英

这个 goroutine 是如何失败的?

[英]How does this goroutine fail?

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 该程序永远运行,没有任何错误。 我可以毫无问题地卷曲它。 为什么是坏代码? 我是一个菜鸟,我试图更好地理解这一点,如果这可以用简单的术语来解释那就太好了。

该程序创建两个 HTTP 服务器来响应接收到不同端口的流量。 调试服务器在单独的 goroutine 中运行,并且无法检测该服务器是否发生故障。 该程序可能会继续与 App 服务器一起运行。

更好的实现是在其中一个服务器失败时停止两个服务器:

stop:=make(chan struct{},2)
go func() {
    defer func() {
        stop<-struct{}{}
    }()
    serveDebug()
}()

go func() {
    defer func() {
         stop <-struct{}{}
    }{}
    serveApp()
}()
<-stop

上面,程序将创建两个 goroutines 并在<-stop处阻塞,直到有人写入通道。 如果任何一个服务器发生故障,goroutine 将写入通道,这将解除阻塞<-stop ,因此程序将退出。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM