为什么golang中的web服务器不处理并发请求?

时间:2012-05-23 13:23:36

标签: go

这个简单的HTTP服务器包含对time.Sleep()的调用 每个请求需要五秒钟。当我尝试快速加载多个 浏览器中的选项卡,显然是每个请求 排队并按顺序处理。如何让它处理并发请求?

package main

import (
   "fmt"
   "net/http"
   "time"
)

func serve(w http.ResponseWriter, r *http.Request) {
   fmt.Fprintln(w, "Hello, world.")
   time.Sleep(5 * time.Second)
}

func main() {
   http.HandleFunc("/", serve)
   http.ListenAndServe(":1234", nil) 
}

实际上,我在写完问题之后才找到答案,而且非常微妙。无论如何,我发布它,因为我在Google上找不到答案。你能看出我做错了吗?

3 个答案:

答案 0 :(得分:99)

您的程序已同时处理请求。您可以使用Apache {2>附带的基准工具ab对其进行测试。

ab -c 500 -n 500 http://localhost:1234/

在我的系统上,基准测试总共花费5043毫秒来处理所有500个并发请求。 只是您的浏览器限制了每个网站的连接数。

基准测试Go程序并不是那么容易,因为您需要确保您的基准测试工具不是瓶颈,并且它还能够处理那么多并发连接。因此,使用几台专用计算机来生成负载是个好主意。

答案 1 :(得分:10)

从Server.go开始,当接受连接时,在Serve函数中生成go例程。以下是片段: -

// Serve accepts incoming connections on the Listener l, creating a 
// new service goroutine for each.  The service goroutines read requests and
// then call srv.Handler to reply to them.
func (srv *Server) Serve(l net.Listener) error {
        for {
            rw, e := l.Accept()
               if e != nil {
......
            c, err := srv.newConn(rw)
            if err != nil {
                continue
            }
            c.setState(c.rwc, StateNew) // before Serve can return
            go c.serve()
        }
}

答案 2 :(得分:-3)

如果使用xhr请求,请确保xhr实例是局部变量。

例如,xhr = new XMLHttpRequest()是一个全局变量。当您使用相同的xhr变量执行并行请求时,您只会收到一个结果。因此,您必须在本地声明xhr,如var xhr = new XMLHttpRequest()