http - 为什么 net/http 处理程序不能同时处理多个请求?
问题描述
我创建了一个小型测试服务器来测试处理程序中发生的事情。这是它的样子:
package main
import (
"fmt"
"log"
"net/http"
)
func HelloHandler(w http.ResponseWriter, r *http.Request) {
fmt.Println("HIT HANDLER")
time.Sleep(10 * time.Second)
fmt.Println("FINISHED")
}
func main() {
http.HandleFunc("/hello", HelloHandler)
fmt.Printf("Starting server at port 8080\n")
if err := http.ListenAndServe(":8080", nil); err != nil {
log.Fatal(err)
}
}
第二个“HIT HANDLER”只会在第一次后退出。睡眠结束。
这是为什么?为什么这是同步行为?这两个请求是否在内存中达到相同的确切功能?公司如何大规模处理这个问题?假设有人试图点击一个登录处理程序,而当他们登录的过程正在进行时,其他人点击了同一个处理程序?
解决方案
标准库中包含的 HTTP 服务器(您的示例使用的那个)在一个新的 goroutine 中处理每个传入的请求,因此它们同时运行。
您的应用可以同时处理多个请求。你所经历的是你如何测试它的结果。可能您打开了浏览器并输入http://localhost:8080/hello
了 2 个不同的选项卡。如果请求相同的 URL 并且其中一个正在进行中,而第二个未启动,则可能是您的浏览器的限制。这就是我在 Chrome 上尝试和体验过的。
但是,如果您打开 2 个不同的浏览器,例如 Chrome 和 Firefox,并“同时”从这两个浏览器访问此页面,您将HIT HANDLER
立即看到打印两次,而没有看到FINISHED
打印。
如果你打开 2 个终端,你会得到相同的结果,然后执行
wget http://localhost:8080/hello
在他们两个。
推荐阅读
- css - 如何垂直集中 div 并将它们并排放置?
- spring-boot - Spring Boot 2.4 应用程序不使用自定义 WebMvcConfigurer#addResourceHandlers 解析静态内容
- azure-devops-server-2020 - 保留政策似乎没有删除旧的 YAML 运行
- python - 当用户加入服务器时,我如何给用户一个角色?
- android - Android webview 摄像头和麦克风权限
- pdftotext - PDF 到文本的转换而不会丢失格式
- oracle - plsql将失败传递回执行作业
- linker-errors - 链接 gfortran 时出现问题,重定位被截断以适应
- typescript - 带有 JEST 错误的 Tone.js 测试:“ReferenceError:未定义 AudioBuffer”
- python - 如何在 discord.py 上转移服务器所有权?