为了账号安全,请及时绑定邮箱和手机立即绑定

为什么我在golang中的网络服务器不处理并发请求?

为什么我在golang中的网络服务器不处理并发请求?

Go
繁星淼淼 2021-05-03 17:30:45
这个简单的HTTP服务器包含对time.Sleep()的调用,该请求使每个请求花费五秒钟。当我尝试在浏览器中快速加载多个选项卡时,很明显每个请求都按顺序排队和处理。如何使其处理并发请求?package mainimport (   "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 回答

?
芜湖不芜

TA贡献1796条经验 获得超7个赞

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

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

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

顺便说一下,对Go程序进行基准测试并不是那么容易,因为您需要确保基准测试工具不是瓶颈,并且它还能够处理这么多并发连接。因此,最好使用几个专用计算机来生成负载。


查看完整回答
反对 回复 2021-05-10
?
函数式编程

TA贡献1807条经验 获得超9个赞

在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()

        }

}


查看完整回答
反对 回复 2021-05-10
?
侃侃无极

TA贡献2051条经验 获得超10个赞

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

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


查看完整回答
反对 回复 2021-05-10
  • 3 回答
  • 0 关注
  • 238 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信