gpt4 book ai didi

multithreading - golang并发http请求处理

转载 作者:IT王子 更新时间:2023-10-29 02:27:38 25 4
gpt4 key购买 nike

我正在使用 golang 创建一个简单的 http 服务器。我有两个问题,一个是理论性的,另一个是关于实际程序的。

  1. 并发请求处理

我创建了一个服务器并使用 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”都出现。但是,如果我删除 Sleep 行,我会看到该程序在完成前一个请求之前从不启动请求(输出为 1 2 1 2 1 2 ...)。所以我不明白,它们是否并发。如果是的话,我希望看到打印品有些乱...

  1. 现实生活中的问题

在真正的处理程序中,我将请求发送到另一台服务器并将答案返回给用户(对请求和答案进行了一些更改,但我认为它是一种代理)。所有这一切当然都需要时间,而且从可以看到的(通过向处理程序添加一些打印)来看,请求是一个接一个地处理的,它们之间没有并发(我的打印显示请求开始,完成所有步骤,结束,然后我才看到一个新的开始……)。我该怎么做才能使它们真正并发?
将处理函数作为 goroutine 会产生错误,请求的主体已经关闭。此外,如果它已经是并发的,则添加更多 goroutine 只会让事情变得更糟。

谢谢!

最佳答案

你的例子让人很难判断发生了什么。

下面的示例将清楚地说明请求是并行运行的。

package main

import (
"fmt"
"log"
"net/http"
"time"
)

func main() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
if len(r.FormValue("case-two")) > 0 {
fmt.Println("case two")
} else {
fmt.Println("case one start")
time.Sleep(time.Second * 5)
fmt.Println("case one end")
}
})

if err := http.ListenAndServe(":8000", nil); err != nil {
log.Fatal(err)
}
}

http://localhost:8000提出一个请求

再次请求 http://localhost:8000?case-two=true 5秒内

控制台输出将是

case one start
case two
case one end

关于multithreading - golang并发http请求处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40610398/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com