为什么goroutine会阻止此http服务器中的main func?
我想设置一个http服务器,在两个端口为什么goroutine会阻止此http服务器中的main func?,go,Go,我想设置一个http服务器,在两个端口8888和8080上侦听httprouter,就像下面的代码一样 package main import ( "fmt" "github.com/julienschmidt/httprouter" "log" "net/http" ) func Index(w http.ResponseWriter, r *http.Request, _ httprouter.Params) { fmt.Fprint(w, "We
8888
和8080
上侦听httprouter,就像下面的代码一样
package main
import (
"fmt"
"github.com/julienschmidt/httprouter"
"log"
"net/http"
)
func Index(w http.ResponseWriter, r *http.Request, _ httprouter.Params) {
fmt.Fprint(w, "Welcome!\n")
}
func main() {
router := httprouter.New()
router.GET("/", Index)
fmt.Println("listen on 8080")
// this is where blocked
go log.Fatal(http.ListenAndServe(":8080", router))
fmt.Println("listen on 8888")
log.Fatal(http.ListenAndServe(":8888", router))
}
但它不能正常工作,我的服务器只监听8080
。如果我做了一些更改:
go func() { log.Fatal(http.ListenAndServe(":8080", router)) }()
它在8080
和8888
上都能很好地工作。为什么呢?是关于结束还是别的什么
函数值和参数在调用goroutine中按常规进行计算
-
您正在为调用
log.Fatal
创建一个goroutine,但是log.Fatal
的参数会在主goroutine中预先计算。而Fatal
的参数是http.ListenAndServe
的返回值。因此,新的goroutine在ListenAndServe
返回后才会启动。因为http.ListenAndServe()
正在阻塞,在您的场景中,有两个,然后尝试将其中一个放入goroutine中。其思想是将这两个web服务器初始化语句的执行分离到单独的goroutine中
func main() {
router := httprouter.New()
router.GET("/", Index)
go func() {
fmt.Println("listen on 8080")
log.Fatal(http.ListenAndServe(":8080", router))
}()
fmt.Println("listen on 8888")
log.Fatal(http.ListenAndServe(":8888", router))
}