我正在使用golang创建一个简单的http服务器。我有两个问题,一个更理论,另一个关于真正的计划。golang并发http请求处理

  1. 并发请求处理

我创建了一个服务器,并使用s.ListenAndServe()来处理请求。我很了解同时服务的请求。我用一个简单的处理程序,以检查它:

func ServeHTTP(rw http.ResponseWriter, request *http.Request) { 
    fmt.Println("1") 
    time.Sleep(1 * time.Second)  //Phase 2 delete this line 
    fmt.Fprintln(rw, "Hello, world.") 
    fmt.Println("2") 
} 

我看到,如果我发送多个请求,我会看到所有的“1”的出现,只有经过第二所有的“2”出现。 但是,如果我删除睡眠线,我看到该程序从未开始一个请求,在它完成前一个(输出是1 2 1 2 1 2 ...)。 所以我不明白,如果他们是并行的或不真的。如果他们是我希望看到在打印一些乱七八糟......

  • 现实生活中的问题
  • 在实际处理程序,我请求发送到另一台服务器并将答案返回给用户(对请求和答案进行了一些更改,但在想法上它是一种代理)。所有这一切都需要时间,并且从看到的东西(通过向处理程序添加一些打印件)中,请求被逐个处理,它们之间没有并发(我的打印件向我显示请求开始,执行所有步骤,结束,只有我看到一个新的开始....)。 我能做些什么来使它们真正并发?
    把处理函数作为goroutine给出错误,请求的主体已经关闭。另外,如果它已经同时增加更多goroutines将使事情变得更糟。

    谢谢!

    2016-11-15 Ety

    +1

    这些请求默认是并发的。除非您使用goroutines,否则处理程序内部的任何内容都是连续的。 –

    +0

    您检查请求是否被并发处理的方式是有缺陷的。所有的请求总是以并行的方式进行处理,无论您的打印报告如何让您思考。 –

    +1

    我建议你发送并发请求到你的服务器,看看会发生什么! –