一尘不染

Web服务器请求会生成自己的goroutine吗?

go

我想知道goroutine和go网络服务器在请求进入时如何工作:

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

在这段代码中

  1. 每次/致电的请求handler。这是否意味着每个请求都会生成自己的goroutine?或者它派生自己的process还是thread?是否有任何文档说明这些请求如何获得自己的goroutine?

  2. 其他语言如何处理此请求?例如,Python flask是否为每个请求启动自己的进程?

谢谢,


阅读 209

收藏
2020-07-02

共1个答案

一尘不染

net/http根据http://golang.org/pkg/net/http/#Server.Serve的文档,Go的HTTP服务器(中的)会按请求为每个请求生成一个goroutine(不是线程)-

服务在侦听器l上接受传入连接,为每个连接创建一个新的服务goroutine。服务goroutine读取请求,然后调用srv.Handler对其进行回复。

其他语言可以通过多种方式处理此问题,包括:

  • 基于事件的架构ala node.js 1
  • 多个进程和/或线程(或两者),其中“管理器”根据正在阻止的(和没有阻止的)在活动线程之间切换

我建议阅读https://www.digitalocean.com/community/tutorials/a-comparison-of-rack-
web-servers-for-ruby-web-
applications,以了解一些Ruby
Web服务器的工作方式示例事物(包括上述方法),以及适用于Python的https://www.digitalocean.com/community/tutorials/a-comparison-
of-web-servers-for-python-based-web-
applications,其中应包括洞察力。

2020-07-02