如何用go编程语言处理并行HTTP请求?

时间:2012-06-25 21:53:44

标签: go

我正在使用go HTTP包。我想像在java中那样并行处理请求。但我不能。

我创建了一个简单的Web服务器,在中间休眠,并意识到每次处理一个请求,所以如果我在浏览器上刷新,第一个请求的过程必须完成,直到第二个请求开始处理,这里是代码:

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服务器使用不同的线程处理每个请求吗?

欢迎任何帮助......

Fersca

3 个答案:

答案 0 :(得分:21)

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

在一个使用http流水线和重用连接的浏览器的世界中,这可能并不总是很好。很可能你的浏览器正在重新使用一个连接,这个连接会停止它,直到goroutine处理当前请求结束。

答案 1 :(得分:0)

要允许运行时支持使用多个OS线程,您可能需要通过以下方式设置该数字:

 runtime.GOMAXPROCS(n)

或设置GOMAXPROCS环境变量。

要获取可用核心数,请使用

 runtime.NumCPU()

所以你经常最终得到

 runtime.GOMAXPROCS(runtime.NumCPU())

答案 2 :(得分:0)

我认为您的浏览器正在等待,因为您没有向其发送回复 你的浏览器发出请求说你好和sayHello也请求processRequest, 从您的代码processRequest发回一个对sayHello的回复,但是sayHello没有向浏览器发回回复。

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