首页 > 解决方案 > 为什么 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”只会在第一次退出。睡眠结束。
这是为什么?为什么这是同步行为?这两个请求是否在内存中达到相同的确切功能?公司如何大规模处理这个问题?假设有人试图点击一个登录处理程序,而当他们登录的过程正在进行时,其他人点击了同一个处理程序?

标签: httpgoconcurrency

解决方案


标准库中包含的 HTTP 服务器(您的示例使用的那个)在一个新的 goroutine 中处理每个传入的请求,因此它们同时运行。

您的应用可以同时处理多个请求。你所经历的是你如何测试它的结果。可能您打开了浏览器并输入http://localhost:8080/hello了 2 个不同的选项卡。如果请求相同的 URL 并且其中一个正在进行中,而第二个未启动,则可能是您的浏览器的限制。这就是我在 Chrome 上尝试和体验过的。

但是,如果您打开 2 个不同的浏览器,例如 Chrome 和 Firefox,并“同时”从这两个浏览器访问此页面,您将HIT HANDLER立即看到打印两次,而没有看到FINISHED打印。

如果你打开 2 个终端,你会得到相同的结果,然后执行

wget http://localhost:8080/hello

在他们两个。


推荐阅读