英文:
In Golang, Is http.HandleFunc block?
问题
我在Golang中编写了一个HTTP服务器,但是我发现当有多个请求来自Web浏览器时,http.HandleFunc会被阻塞。我该如何使服务器能够同时处理多个请求?谢谢。
我的代码是:
func DoQuery(w http.ResponseWriter, r *http.Request) {
r.ParseForm()
fmt.Printf("%d path %s\n", time.Now().Unix(), r.URL.Path)
time.Sleep(10 * time.Second)
fmt.Fprintf(w, "hello...")
//为什么这个函数在多个请求时会被阻塞?
}
func main() {
fmt.Printf("服务器开始工作...\n")
http.HandleFunc("/query", DoQuery)
s := &http.Server{
Addr: ":9090",
ReadTimeout: 30 * time.Second,
WriteTimeout: 30 * time.Second,
//MaxHeaderBytes: 1 << 20,
}
log.Fatal(s.ListenAndServe())
fmt.Printf("服务器停止...")
}
我运行了你的代码,一切都按预期工作。我同时进行了两个请求(curl localhost:9090/query),它们都在10秒后一起完成。也许问题出在其他地方?这是我使用的命令:time curl -s localhost:9090/query | echo $(curl -s localhost:9090/query) – tjameson
谢谢
这很奇怪。当我从Chrome请求相同的URL时,发送两个请求不能同时处理,但是使用curl测试可以同时处理。但是当我使用不同的URL发送两个请求时,它们可以同时处理。
[root@localhost httpserver]# ./httpServer
服务器开始工作...
1374301593 path /query?form=chrome
1374301612 path /query?from=cur2
1374301614 path /query?from=cur1
1374301618 path /query?form=chrome
1374301640 path /query?form=chrome2
1374301643 path /query?form=chrome1
*1374301715 path /query?form=chrome
1374301725 path /query?form=chrome*
**1374301761 path /query?form=chrome1
1374301763 path /query?form=chrome2**
英文:
i'm write a httpserver in Golang , but i find the http.HandleFunc will be block when multi request from the web browser. how can i do make the server handle multi request in the same time ? thanks.
my code is:
func DoQuery(w http.ResponseWriter, r *http.Request) {
r.ParseForm()
fmt.Printf("%d path %s\n", time.Now().Unix(), r.URL.Path)
time.Sleep(10 * time.Second)
fmt.Fprintf(w, "hello...")
//why this function block when multi request ?
}
func main() {
fmt.Printf("server start working...\n")
http.HandleFunc("/query", DoQuery)
s := &http.Server{
Addr: ":9090",
ReadTimeout: 30 * time.Second,
WriteTimeout: 30 * time.Second,
//MaxHeaderBytes: 1 << 20,
}
log.Fatal(s.ListenAndServe())
fmt.Printf("server stop...")
}
I ran your code and everything worked as expected. I did two requests at the same time (curl localhost:9090/query) and they both finished 10 seconds later, together. Maybe the problem is elsewhere? Here's the command I used: time curl -s localhost:9090/query | echo $(curl -s localhost:9090/query) – tjameson
thakns
that's strange.
when i request same url from chrome ,send two request not handle in the same time, but use cur test can handle in the same time.
but when i send two request use different url, it's can be handle in the same time.
[root@localhost httpserver]# ./httpServer
server start working...
1374301593 path /query?form=chrome
1374301612 path /query?from=cur2
1374301614 path /query?from=cur1
1374301618 path /query?form=chrome
1374301640 path /query?form=chrome2
1374301643 path /query?form=chrome1
*1374301715 path /query?form=chrome
1374301725 path /query?form=chrome*
**1374301761 path /query?form=chrome1
1374301763 path /query?form=chrome2**
答案1
得分: 20
是的,标准的HTTP服务器会为每个请求启动一个新的goroutine。根据操作系统的设置,您应该能够并行处理数千个请求。
您的浏览器可能会限制发送到一个服务器的请求数量;请确保您正在使用没有这种限制/“优化”的客户端进行测试。
可靠的Go文档解释了Http服务器为每个请求创建一个新的goroutine:http://golang.org/pkg/net/http/#Server.Serve
英文:
Yes, the standard HTTP server will start a new goroutine for each request. You should be able to do thousands of requests in parallel depending on the operating system settings.
Your browser might be limiting how many requests it will send to one server; be sure you are testing with a client that doesn't have that limitation/"optimization".
Reliably Go docs explaining Http Server creates a new gorotine for each request: http://golang.org/pkg/net/http/#Server.Serve
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论