Fersca
Fersca

Reputation: 1026

How to process parallel HTTP request in go programming language?

I was playing with the go HTTP package. I wanted to process request in parallel as I do in java. But I couldn't.

I created a simple web server, put a sleep in the middle and realized that go process one request per time, so if I did a refresh on my browser, the process of the first request has to finish until the second request start processing, here is the code:

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")
}

As I wanted to process both request in parallel I added the "go" command before "processRequest(c, req)" in "sayHello" function in order to process each request in a different gorutine. But... it doesn't work.... I don't know why. I know that both request are processed because I see the printed line at the console but the browser keep waiting for information..... and don't show my response.

So... my questions,

Does each request create a new http.ResponseWriter? or it's use the same? Do you know how to indicate the web server to process each request with different threads?

Any help is welcomed....

Fersca

Upvotes: 10

Views: 4847

Answers (3)

metakeule
metakeule

Reputation: 3914

To allow the run-time support to utilize more than one OS thread you might want to set that number via:

 runtime.GOMAXPROCS(n)

or set the GOMAXPROCS environment variable.

To get the number of available cores, use

 runtime.NumCPU()

So you often end up with

 runtime.GOMAXPROCS(runtime.NumCPU())

Upvotes: 0

Felix Zilla
Felix Zilla

Reputation: 13

I think your browser is waiting because you did not sent a response back to it Your browser made a request to sayHello and sayHello also made a request to processRequest, from your code processRequest sent back a response to sayHello but sayHello did not send back a response to the browser.

you can use http.Get or http.Post to call processRequest

Upvotes: 0

Stephen Weinberg
Stephen Weinberg

Reputation: 53398

All connections are automatically handled concurrently. Each TCP connection (not request) gets its own goroutine.

In a world with http pipelining and browsers that reuse connections, this may not always work out well. Most likely your browser is reusing a connection which stalls it until the current request being processed by the goroutine finishes.

Upvotes: 22

Related Questions