登录
首页 >  Golang >  Go问答

http.HandleFunc 注册的 handler 触发时是串行的还是并发的?

来源:SegmentFault

时间:2023-01-07 17:29:40 430浏览 收藏

亲爱的编程学习爱好者,如果你点开了这篇文章,说明你对《http.HandleFunc 注册的 handler 触发时是串行的还是并发的?》很感兴趣。本篇文章就来给大家详细解析一下,主要介绍一下go,希望所有认真读完的童鞋们,都有实质性的提高。

问题内容

即这个接口 https://golang.org/pkg/net/ht...,初入 golang,直接去看源码没找到,还请熟悉的大兄弟解答一下,先行谢过。

正确答案

http.Handler是并发执行。

当srv接受一个请求后,会调用

http.ServeMux.ServeHTTP
处理这个请求,
http.ServeMux.ServeHTTP
->
http.ServeMux.Handler
->
http.ServeMux.handler
,ServeMux这个顺序是串行的,但是http.Server for Accept go serve是并行的

// https://golang.org/src/net/http/server.go L2900
    for {
        rw, err := l.Accept()
        if err != nil {
            select {
            case  max {
                    tempDelay = max
                }
                srv.logf("http: Accept error: %v; retrying in %v", err, tempDelay)
                time.Sleep(tempDelay)
                continue
            }
            return err
        }
        connCtx := ctx
        if cc := srv.ConnContext; cc != nil {
            connCtx = cc(connCtx, rw)
            if connCtx == nil {
                panic("ConnContext returned nil")
            }
        }
        tempDelay = 0
        c := srv.newConn(rw)
        c.setState(c.rwc, StateNew) // before Serve can return
        go c.serve(connCtx)
    }

c.serve这个地方就开始请求并发了,后续*conn读取net.Conn数据,构建http.Request和http.ResponseWriter对象,然后调用srv.Handler对象执行请求(L1895 -> L2799 -> L2807处理默认Handler),但是srv.Handler对象当前说的这种情况下值为http.ServeMux,所以下一步执行就从http.ServeMux.ServeHTTP开始。

文中关于golang的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《http.HandleFunc 注册的 handler 触发时是串行的还是并发的?》文章吧,也可关注golang学习网公众号了解相关技术文章。

声明:本文转载于:SegmentFault 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>