I want to know how exactly goroutine and go web server works whenever requests come in:
func handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hi there, I love %s!", r.URL.Path[1:])
}
func main() {
http.HandleFunc("/", handler)
http.ListenAndServe(":8080", nil)
}
In this code,
Every request to /
calls the handler
. Does this mean each request spawns its own goroutine? Or does it spawns its own process
or thread
? Is there any documentation on how those requests get its own goroutine?
How do other languages handle this request? For example, does Python flask launch its own process for each request?
Thanks,
Go's HTTP server (in net/http
) spawns a goroutine (not a thread) per request as per the docs for http://golang.org/pkg/net/http/#Server.Serve -
Serve accepts incoming connections on the Listener l, creating a new service goroutine for each. The service goroutines read requests and then call srv.Handler to reply to them.
Other languages handle this in many ways, including:
- Event-based architectures ala node.js1 and
- Multiple processes and/or threads (or both) where the "manager" switches between the active thread based on what is blocking (and what isn't)
I'd suggest reading https://www.digitalocean.com/community/tutorials/a-comparison-of-rack-web-servers-for-ruby-web-applications for an example of how some of the Ruby web servers do things (which include the approaches above), and https://www.digitalocean.com/community/tutorials/a-comparison-of-web-servers-for-python-based-web-applications for Python, which should give some insight.