为了账号安全,请及时绑定邮箱和手机立即绑定

这个 goroutine 是如何失败的?

这个 goroutine 是如何失败的?

Go
PIPIONE 2022-06-27 15:43:30
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。该程序永远运行,没有任何错误。我可以毫无问题地卷曲它。为什么代码不好?我是一个菜鸟,我正在努力更好地理解这一点,如果这可以用简单的术语来解释,那就太好了。
查看完整描述

1 回答

?
手掌心

TA贡献1942条经验 获得超3个赞

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


如果其中一个失败,更好的实现是停止两台服务器:


stop:=make(chan struct{},2)

go func() {

    defer func() {

        stop<-struct{}{}

    }()

    serveDebug()

}()


go func() {

    defer func() {

         stop <-struct{}{}

    }{}

    serveApp()

}()

<-stop

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


查看完整回答
反对 回复 2022-06-27
  • 1 回答
  • 0 关注
  • 97 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信