基于服务器的fasthttp
速度比net/http
.
哪些实现细节使fasthttp
速度如此之快?此外,它如何更好地管理传入请求net/http
?
来自husobee的文章“ http implementation fasthttp in golang ”提到:
嗯,这是一个更好的实现,有几个原因:
- worker 池模型是零分配模型,因为 worker 已经初始化并准备好服务,而在 stdlib 实现中
go c.serve()
必须为 goroutine 分配内存。- 工作池模型更容易调整,因为您可以增加/减少您能够接受的工作单元数量的缓冲区大小,而不是标准库中的火和忘记模型
- 工作池模型允许处理程序通过通道通信与服务器建立更多连接,例如,如果服务器需要关闭,它将能够比在 stdlib 实现中更容易地与工作人员通信
- 处理程序函数定义签名更好,因为它只接受一个上下文,其中包括处理程序所需的请求和编写器。这比标准库好得多,因为你从 stdlib 得到的只是一个请求和响应编写器……在 go1.7 中将上下文包含在请求中的工作几乎是一种黑客,可以为人们提供他们真正想要的东西(上下文)不破坏任何人。
总体而言,最好编写一个具有工作池模型的服务器来处理请求,而不是仅仅为每个请求生成一个“线程”,而没有开箱即用的限制。