for {
rw, e := l.Accept()
if e != nil {
select {
case <-srv.getDoneChan():
return ErrServerClosed
default:
}
if ne, ok := e.(net.Error); ok && ne.Temporary() {
if tempDelay == 0 {
tempDelay = 5 * time.Millisecond
} else {
tempDelay *= 2
}
if max := 1 * time.Second; tempDelay > max {
tempDelay = max
}
srv.logf("http: Accept error: %v; retrying in %v", e, tempDelay)
time.Sleep(tempDelay)
continue
}
return e
}
tempDelay = 0
c := srv.newConn(rw)
c.setState(c.rwc, StateNew) // before Serve can return
go c.serve(ctx)
}
去掉错误处理
for {
rw, e := l.Accept()
//去掉了错误处理
tempDelay = 0
c := srv.newConn(rw)
c.setState(c.rwc, StateNew) // before Serve can return
go c.serve(ctx)
}
因为协程go
的存在,不需要写复杂的逻辑就可以完成多路请求的并发处理。无需像netty框架的NioEeventLoopGroup
一样一顿操作猛如虎了。
但是世界上没有免费的午餐,所有的通用型逻辑都有其妥协之处。定制的代码才是性能最高的。
后续看看能不能看懂goroutine的逻辑及其大量协程存在时的性能问题的原因。
网友评论