golang net/http的小问题

Go 仍然是一门必须随时翻 ref/spec 和源码才能写代码的语言……文档本身是完全不够的……https://golang.org/src/net/http/server.go?s=51112:51172#L1574// HTTP cannot have multiple simultaneous active requests.// Until the server replies to this request, it can\u0026#39;t read another,// so we might as well run the handler in this goroutine.// Not strictly true: HTTP pipelining. We could let them all process// in parallel even if their responses need to be serialized.serverHandler{c.server}.ServeHTTP(w, w.req)w.cancelCtx()1、Accept 在调用用户 handler 之前已经启了 goroutine,所以没必要启。2、如上面代码所示,net/http 框架期待 handler 是同步执行的。“提前关闭”就是 w.cancelCtx 做的,因为它认为 handler 已经执行完了。
■网友
哥们儿 你知道文档是干啥的不
■网友
http本身就是基于goroutine实现,没有必要这么写。
■网友
文档说的很清楚,handler退出即认为处理结束
■网友
是对goroutine 没有理解,通过goroutine 执行我更愿意理解为委托,是将一个函数委托给一个goroutine,而委托函数不会对委托者进行block,有很多类似goroutine 例子,表现状态都是委托者函数执行完毕而委托函数才刚刚开始,代码增加chan 就可以解决,其实本质就是等待委托函数执行完毕,所有的异步编程都是一样,和语言无关,你只是缺少一个callback罢了。
■网友
顶唐生的说法楼主可以看一下martini的源码,应该跟golang原有的差不多思路。\tfor r.index \u0026lt; len(r.handlers) {\t\thandler := r.handlers\t\tvals, err := r.Invoke(handler)\t\tif err != nil {\t\t\tpanic(err)\t\t}\t\tr.index += 1 //some function\t\tif r.Written() {\t\t\treturn\t\t}\t}问题的关键在于当这一批处理函数执行完或者进行了w.Write这一操作,则r.Written()会为true了,不会继续往下走了。当你起了goroutine之后并退出serve函数之后,被认为整个流程已经走完,http连接已经处于idle的状态,这是不允许在对req进行处理了我们项目的代码通常会在http处理流程中使用goroutine进行统计


    推荐阅读