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是串行还是并发的?的详细内容,更多请关注其它相关文章!