測試代碼
Sanic:
from sanic import Sanic
from sanic.response import json
from sanic.request import Request
app = Sanic("Demo Of Sanic")
@app.get("/")
async def test(request: Request):
return json({'Hello': 'World'})
if __name__ == '__main__':
app.run(workers=8)
Fiber:
package main
import (
"github.com/gofiber/fiber/v2"
)
func main() {
app := fiber.New()
app.Get("/", func(c *fiber.Ctx) error {
return c.JSON(map[string]string{
"Hello": "World",
})
})
app.Listen(":8000")
}
壓測
壓測使用的程序是go-stress-testing
,1000
個並發,每個並發進行1000
次請求。
每欄對應的字段為:
耗時 │ 並發數 │ 成功數│ 失敗數 │ qps │ 最長耗時 │ 最短耗時│ 平均耗時│ 下載字節│ 字節每秒│ 錯誤碼
Sanic:
...
1s│ 1000│ 4064│ 0│ 4688.36│ 428.60│ 106.12│ 213.29│ 69,088│ 69,028│200:4064
...
188s│ 1000│ 989209│ 0│ 5404.96│ 578.58│ 71.49│ 185.02│16,816,553│ 89,449│200:989209
189s│ 1000│ 995278│ 0│ 5409.15│ 578.58│ 71.49│ 184.87│16,919,726│ 89,522│200:995278
190s│ 1000│1000000│ 0│ 5420.32│ 578.58│ 0.40│ 184.49│17,000,000│ 89,621│200:1000000
************************* 結果 stat ****************************
處理協程數量: 1000
請求總數(並發數*請求數 -c * -n): 1000000 總請求時間: 189.687 秒 successNum: 1000000 failureNum: 0
tp90: 235.000
tp95: 299.000
tp99: 387.000
************************* 結果 end ****************************
Fiber:
...
1s│ 1000│ 4264│ 0│ 4944.17│ 428.17│ 103.75│ 202.26│ 72,488│ 72,486│200:4264
...
160s│ 1000│ 991952│ 0│ 6367.34│ 428.17│ 87.23│ 157.05│16,863,184│ 105,394│200:991952
161s│ 1000│ 998890│ 0│ 6374.53│ 428.17│ 60.73│ 156.87│16,981,130│ 105,472│200:998890
161s│ 1000│1000000│ 0│ 6379.79│ 428.17│ 0.31│ 156.75│17,000,000│ 105,514│200:1000000
************************* 結果 stat ****************************
處理協程數量: 1000
請求總數(並發數*請求數 -c * -n): 1000000 總請求時間: 161.116 秒 successNum: 1000000 failureNum: 0
tp90: 175.000
tp95: 182.000
tp99: 198.000
************************* 結果 end ****************************
可以看出來,sanic
和fiber
差別不大,sanic
的性能幾乎與fiber
持平,可能是當下最高性能的 Python Web 框架,沒有之一,即便是之前較為突出的異步框架fastapi
也要落后於sanic
。
附上fastapi
的結果:
...
1s│ 1000│ 3140│ 0│ 3868.18│ 397.67│ 98.50│ 258.52│ 53,380│ 52,552│200:3140
...
239s│ 1000│ 991225│ 0│ 4254.52│ 557.98│ 87.20│ 235.04│16,850,825│ 70,505│200:991225
240s│ 1000│ 995799│ 0│ 4257.07│ 557.98│ 87.20│ 234.90│16,928,583│ 70,535│200:995799
241s│ 1000│1000000│ 0│ 4266.06│ 557.98│ 0.79│ 234.41│17,000,000│ 70,585│200:1000000
************************* 結果 stat ****************************
處理協程數量: 1000
請求總數(並發數*請求數 -c * -n): 1000000 總請求時間: 240.841 秒 successNum: 1000000 failureNum: 0
tp90: 279.000
tp95: 296.000
tp99: 348.000
************************* 結果 end ****************************
Flask
、Django
等框架不在本文討論范圍之內,這二者本就不是為了高性能設計的框架,沒有對比的意義。
sanic
還有一個優勢,就是其沒有開發服務器,用sanic -w 8 main.app
運行的服務器就是生產服務器。
如果有想用 Python 開發 Web 服務器的,建議優先考慮sanic
,但fastapi
其實也夠用了。