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秒后),第二个开始
  • 为什么?我希望它们能够并行处理…
  • 这是交易破坏者,这意味着客户端不能在同一时刻访问同一页面
如何回复客户并在以后处理? 在处理程序中添加goroutine

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...