【问题标题】:How to process parallel HTTP request in go programming language?如何用 Go 编程语言处理并行 HTTP 请求?
【发布时间】:2012-06-25 21:53:43
【问题描述】:

我在玩 go HTTP 包。我想像在 java 中那样并行处理请求。但我做不到。

我创建了一个简单的网络服务器,中间放了一个睡眠,并意识到 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”命令,以便在不同的 gorutine 中处理每个请求。但是......它不起作用......我不知道为什么。我知道这两个请求都已处理,因为我在控制台上看到了打印的行,但浏览器一直在等待信息.....并且不显示我的响应。

所以...我的问题,

每个请求是否都会创建一个新的 http.ResponseWriter?或者它的用途相同? 你知道如何指示 Web 服务器使用不同的线程处理每个请求吗?

欢迎任何帮助....

福斯卡

【问题讨论】:

    标签: go


    【解决方案1】:

    自动同时处理所有连接。每个 TCP 连接(不是请求)都有自己的 goroutine。

    在一个使用 http 管道和重用连接的浏览器的世界中,这可能并不总是很好。很可能您的浏览器正在重用一个连接,该连接会在 goroutine 正在处理的当前请求完成之前停止连接。

    【讨论】:

    • 谢谢。今天浪费了这么多时间,只是因为浏览器的行为太聪明了:)
    【解决方案2】:

    我认为您的浏览器正在等待,因为您没有回复它 你的浏览器向 sayHello 发出了请求,sayHello 也向 processRequest 发出了请求, 从您的代码 processRequest 向 sayHello 发回响应,但 sayHello 没有向浏览器发回响应。

    你可以使用 http.Get 或 http.Post 来调用 processRequest

    【讨论】:

      【解决方案3】:

      要允许运行时支持使用多个操作系统线程,您可能希望通过以下方式设置该数量:

       runtime.GOMAXPROCS(n)
      

      或设置 GOMAXPROCS 环境变量。

      要获取可用内核的数量,请使用

       runtime.NumCPU()
      

      所以你经常会遇到

       runtime.GOMAXPROCS(runtime.NumCPU())
      

      【讨论】:

      • 这没有帮助。 Go 默认是并发的,只是不是多线程的(两者之间有很大的区别)。它将在阻塞调用时切换到不同的 goroutine,例如 time.Sleep().Write()
      猜你喜欢
      • 2021-12-03
      • 1970-01-01
      • 2018-03-02
      • 2023-03-23
      • 1970-01-01
      • 2014-07-23
      • 1970-01-01
      • 1970-01-01
      • 2013-02-20
      相关资源
      最近更新 更多