http.HandleFunc注册的Handler是串行还是并发的?

http.handlefunc注册的handler是串行还是并发的?

http.handlefunc 的 handler 执行并发性

使用 http.handlefunc 注册的 handler 在处理请求时的并发性一直是初学者关心的问题。本文将对其进行详细阐述。

问题:http.handlefunc 注册的 handler 是串行还是并发的?

答案:

http.handler 是并行执行的。

原理:

当网络服务器接收一个请求后,会按照以下顺序处理请求:

http.servemux.servehttp
↓
http.servemux.handler
↓
http.servemux.handler

其中,http.servemux.servehttp、http.servemux.handler、http.servemux.handler 的执行顺序是串行的。需要注意的是,尽管这些方法串行执行,但 http 服务器的请求处理是并发的。

当服务器调用 http.server.accept 方法接收请求时,会创建一个新的 goroutine 来处理这个请求。每个请求都会在单独的 goroutine 中处理,因此请求处理是并发的。

以下是相关的关键代码段:

// https://golang.org/src/net/http/server.go L2900
for {
    rw, err := l.Accept()
    if err != nil {
        ...
    }
    ...
    go c.serve(connCtx)
}

在 c.serve 方法中,就开始调用 http.servemux.servehttp 方法并处理请求了。

因此,http.handlefunc 注册的 handler 虽然在其内部执行是串行的,但由于请求是在不同的 goroutine 中并行处理的,因此整体上是并发的。

以上就是http.HandleFunc注册的Handler是串行还是并发的?的详细内容,更多请关注其它相关文章!