use*_*117 -1 concurrency http go
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()
}
Run Code Online (Sandbox Code Playgroud)
然而, 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
Run Code Online (Sandbox Code Playgroud)
上面,程序将创建两个 goroutines 并阻塞 at<-stop
直到有人写入通道。如果其中任何一个服务器出现故障,goroutine 将写入通道,该通道将解除阻塞<-stop
,因此程序将退出。
归档时间: |
|
查看次数: |
47 次 |
最近记录: |