【发布时间】:2015-08-09 20:21:33
【问题描述】:
我对 Go 的例程不是很熟悉,但由于我使用的是 net/http 的路由器,所以我看到有几次ListenAndServe() 被一个 go 例程包裹。
服务器需要能够开箱即用地同时处理多个请求以提高效率。那么为什么使用 goroutine 作为“轻量级线程”呢? 并发有什么好处吗?
这是OpenShift 的示例
package main
import (
"fmt"
"net/http"
)
func helloHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "Hello OpenShift!")
}
func main() {
http.HandleFunc("/", helloHandler)
go func() {
fmt.Println("serving on 8080")
err := http.ListenAndServe(":8080", nil)
if err != nil {
panic("ListenAndServe: " + err.Error())
}
}()
go func() {
fmt.Println("serving on 8888")
err := http.ListenAndServe(":8888", nil)
if err != nil {
panic("ListenAndServe: " + err.Error())
}
}()
select {}
}
【问题讨论】:
-
我相信这样做只是为了让同一个程序可以监听两个端口,而不是为了性能,因为
http.ListenAndServe绑定到单个端口然后阻塞。 -
@Ezra 对列出的示例是正确的,commit log 对此的更改表示“在多个端口上服务”。在您给出的其他每种情况下,这样做的原因都是一样的:对
ListenAndServe的调用阻塞,如果您想要/需要返回,您需要将其放入 goroutine 中。
标签: concurrency go