2012-05-23 49 views
47

这个简单的HTTP服务器包含对time.Sleep()的调用,这使得每个请求的 需要5秒钟。当我尝试在浏览器中快速加载多个 选项卡时,显然每个请求 都按顺序排队并处理。我怎样才能使它处理并发请求?为什么我的golang网络服务器没有处理并发请求?

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上找到答案。你能看到我做错了什么吗?

+0

你发现了什么答案? –

+3

问题在于我测试的方式。网页浏览器限制了它们与任何一台服务器的连接数量,甚至是在标签之间。 –

+1

您也可以使用jMeter向您的服务器发出请求 –

回答

84

你的程序已经同时处理这些请求。你可以用ab测试,一个基准测试工具,它随阿帕奇2:

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

在我的系统,基准总共需要5043ms,为所有500个并发请求。 这只是你的浏览器,它限制了每个网站的连接数量。

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

+24

我想编辑您的答案以从最后一段删除单词“Go”... ;-) – Ashe

+1

我试图理解代码:我们是否暗示http。 HandleFunc()生成一个goroutine来处理请求,并立即返回? – Eno

+9

该goroutines产生得更早。 http.ListenAndServe接受无限循环中的新连接,并产生新的goroutines来处理它们。 – tux21b

7

从Server.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() 
     } 
} 
0

如果你使用XHR请求,确保XHR实例是一个局部变量。

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

相关问题