我正在使用 Go HTTP 包进行编程,希望像 Java 一样并发处理请求。但是我无法实现。
我创建了一个简单的 Web 服务器,在其中加入了一个 sleep(暂停)的函数。结果我意识到 Go 只能逐个处理请求。也就是说,如果在浏览器中刷新页面,第一个请求必须完成处理后,才能开始处理第二个请求。以下是代码:
func main(){
//Process the http commands
fmt.Printf("Starting http Server ... ")
http.Handle("/", http.HandlerFunc(sayHello))
err := http.ListenAndServe("0.0.0.0:8080", nil)
if err != nil {
fmt.Printf("ListenAndServe Error",err)
}
}
func sayHello(c http.ResponseWriter, req *http.Request) {
fmt.Printf("New Request\n")
processRequest(c, req)
}
func processRequest(w http.ResponseWriter, req *http.Request){
time.Sleep(time.Second*3)
w.Write([]byte("Go Say’s Hello(Via http)"))
fmt.Println("End")
}
我想同时处理两个请求,所以在 "sayHello" 函数中的 "processRequest(c, req)" 前添加了 "go" 命令,以便在不同的 goroutine 中处理每个请求。但是……它没有起作用……我不知道为什么。我知道两个请求都已被处理,因为我在控制台上看到了打印的行,但浏览器仍在等待信息……而且没有显示我的响应。
所以……我的问题是:
每个请求是否会创建一个新的 http.ResponseWriter?还是使用相同的? 您知道如何指示 web 服务器使用不同线程处理每个请求吗?
欢迎任何帮助……
Fersca