看了一下:基本上是C写的,所以其实是C的性能

即便这样其实也不足以达到单核一百万次每秒,原因主要在于测试方法启用了HTTP pipelining,即在同一个连接上,没有得到上一次返回的情况下就立即发出下一次请求。

pipelining这种请求方式是RFC允许的,在许多HTTP服务器中也支持,但是实际应用当中几乎从来不会用到,原因在于现在的HTTP版本对于pipelining来说是很脆弱的:我们无法预先知道对端是HTTP/1.0还是HTTP/1.1,对于旧版本的Web服务器来说,它们会在处理一个请求之后就立即发送Connection: close然后关闭连接,这样多发的请求就浪费了,甚至更糟的是向关闭的socket写入数据可能会引发CONNRST状态,导致服务器返回的数据也无法正常读取。即使是HTTP/1.1,也完全有可能在处理若干请求后强制断开连接。一旦发生这些情况,已经从pipelining中发送出的请求有的时候很难确定是否可以安全重发,尤其是发生CONNRST的情况,客户端无法判断是哪一个请求的处理引发了CONNRST。所以基于各种考虑,几乎所有的client都会选择在同一个连接上一次只发送一个请求。

扣除pipelining带来的性能提升的话,应该跟Go和nodejs差不多在同一个水平上,跟以前的uvloop +aioasync的方案应该也差不多。不过实际上由于业务代码还是用Python,加上实际的业务代码之后,估计性能还是跟常用的web服务器差不多,只能跑Hello world的话还不是特别实用。

一个全新的Web Server会带来很多风险,因为HTTP协议实际上相当复杂,那么一个全新的重新实现的服务器就必须要考虑协议解析是否符合RFC规范、是否有安全漏洞等等的问题,aiohttp今天已经应用比较广泛了,但仍然有不少实现不严守RFC的地方,更不用说许多HTTP服务器实现起来各种随性、只测过curl和浏览器能用就发布了,连HTTP头大小写是否敏感可能都没弄明白。当然,如果勇于尝新的话,还是可以尝试一下的。