我正在使用golang创建一个简单的http服务器。我有两个问题,一个更理论,另一个关于真正的计划。golang并发http请求处理
- 并发请求处理
我创建了一个服务器,并使用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
这些请求默认是并发的。除非您使用goroutines,否则处理程序内部的任何内容都是连续的。 –
您检查请求是否被并发处理的方式是有缺陷的。所有的请求总是以并行的方式进行处理,无论您的打印报告如何让您思考。 –
我建议你发送并发请求到你的服务器,看看会发生什么! –