Go ListendServe:是否允许同时进行多个连接?
我使用Go ListendServe:是否允许同时进行多个连接?,go,Go,我使用gorilla/mux制作了一个小型web服务器 我在他们的Github页面的自述文件末尾举了一个小例子 r := mux.NewRouter() r.HandleFunc("/", listUrlsHandler) r.HandleFunc("/foo", fooHandler) http.Handle("/", r) err := http.ListenAndServe(":9090", nil) // set listen port if err != nil { log.
gorilla/mux
制作了一个小型web服务器
我在他们的Github页面的自述文件末尾举了一个小例子
r := mux.NewRouter()
r.HandleFunc("/", listUrlsHandler)
r.HandleFunc("/foo", fooHandler)
http.Handle("/", r)
err := http.ListenAndServe(":9090", nil) // set listen port
if err != nil {
log.Fatal("ListenAndServe: ", err)
}
为了模拟长时间的处理,我在回调函数中添加了一个计时器
func fooHandler(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusOK)
fmt.Fprintln(w, "foo is downloading...")
log.Println("foo is downloading...")
time.Sleep(15*time.Second)
}
我同时运行2x/foo
:
2018/01/12 09:15:03 foo is downloading...
2018/01/12 09:15:18 foo is downloading...
- 只有一个正在处理,第二个未调用。第一个返回后(15秒后),第二个开始
- 为什么?我希望它们能够并行处理…
- 这是交易破坏者,这意味着客户端不能在同一时刻访问同一页面
func fooHandler(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusOK)
fmt.Fprintln(w, "foo is downloading...")
log.Println("foo is downloading...")
go time.Sleep(15*time.Second) // HERE <------------
// go myCustomFunc() // HERE <------------
}
func foodhandler(w http.ResponseWriter,r*http.Request){
w、 WriteHeader(http.StatusOK)
fmt.Fprintln(w,“foo正在下载…”)
Println(“foo正在下载…”)
go time.Sleep(15*time.Second)//此处如果向处理程序添加日志调用,则可以在处理响应时看到:
func downloadFileHandler(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r)
w.WriteHeader(http.StatusOK)
fmt.Fprintf(w, "%s is downloading...\n", vars["namefile"])
log.Printf("%s is downloading...\n", vars["namefile"])
time.Sleep(15*time.Second)
}
例如:
由于Gorilla Mux使用Go的基本Go例程,两个调用都被同步处理,但是15秒的时间会阻止你看到结果。问题是你使用了两种不同的路径foo
和bar
,这没有问题。但是foo
和foo
呢:它们一个接一个地被处理:2018/01/12 09:04:54 foo正在下载…2018/01/12 09:05:09 foo正在下载…
这意味着只有一个客户端可以访问同一个页面?!这对我来说是一个交易破坏者,我想我在实现中做了一些错误。这是一个技术点,但实际上是http.listenandservice
(由Go自己提供)这允许您为网站/应用程序提供服务,而不是gorilla/mux。gorilla提供了一种机制来将传入的请求路由到您提供的go功能。最佳做法是在net/http服务器创建的goroutine上处理请求。如果在写入响应后应用程序还有工作要做,则启动goroutine以执行ute正常工作。这将释放goroutine来处理连接上的下一个请求,而不是每个路由一个。问题在客户端。显示代码或描述您如何请求资源。第二次请求页面时浏览器会暂停。有关信息,请参阅。
2018/01/12 10:52:42 foo is downloading...
2018/01/12 10:52:44 bar is downloading...