這里測(cè)試的Python/ target=_blank class=infotextkey>Python異步框架幾乎都與ASGI兼容(除了aiohttp)。
基準(zhǔn)測(cè)試的目的不是測(cè)試部署(例如uvicorn與hypercorn等)或數(shù)據(jù)庫(kù)(ORM,驅(qū)動(dòng)程序),而是測(cè)試框架本身。基準(zhǔn)檢查檢查請(qǐng)求解析(正文,標(biāo)頭,表單數(shù)據(jù),查詢(xún)),路由,響應(yīng)。
接受請(qǐng)求并返回帶有自定義動(dòng)態(tài)標(biāo)頭的html響應(yīng)解析上傳的文件,將其存儲(chǔ)在磁盤(pán)上并返回文本響應(yīng)解析路徑參數(shù),查詢(xún)字符串,JSON正文并返回JSON響應(yīng)的綜合統(tǒng)計(jì)。
測(cè)試硬件
該基準(zhǔn)使用Github Action運(yùn)行。根據(jù)github文檔 ,運(yùn)行的硬件規(guī)格為:
- 2核vCPU(Intel®Xeon®Platinum 8272CL(Cascade Lake),Intel®Xeon®8171M 2.1GHz(Skylake))
- 7 GB的RAM內(nèi)存
- 14 GB的SSD磁盤(pán)空間
- 操作系統(tǒng)Ubuntu 20.04
使用gunicorn / uvicorn命令從Docker運(yùn)行ASGI應(yīng)用程序:
gunicorn -k uvicorn.workers.UvicornWorker -b 0.0.0.0:8080 App:app
應(yīng)用程序的源代碼可以在此處找到 。
https://github.com/klen/py-frameworks-bench/tree/develop/frameworks
通過(guò)WRK實(shí)用程序收到結(jié)果:
wrk -d15s -t4 -c64 [URL]
基準(zhǔn)測(cè)試包含三種測(cè)試:
- “簡(jiǎn)單”測(cè)試:接受請(qǐng)求并返回帶有自定義動(dòng)態(tài)標(biāo)頭的HTML響應(yīng)。該測(cè)試僅模擬單個(gè)HTML響應(yīng)。
- “上傳”測(cè)試:接受上傳的文件并將其存儲(chǔ)在磁盤(pán)上。該測(cè)試模擬多部分表單數(shù)據(jù)處理并處理文件。
- “ API”測(cè)試:檢查標(biāo)頭,解析路徑參數(shù),查詢(xún)字符串,JSON正文并返回JSON響應(yīng)。該測(cè)試模擬JSON REST API。
接受請(qǐng)求并返回帶有自定義動(dòng)態(tài)標(biāo)頭的HTML響應(yīng)
該測(cè)試僅模擬單個(gè)HTML響應(yīng)。按最大請(qǐng)求數(shù)/秒排序
|
框架 |
請(qǐng)求/秒 |
延遲50%(毫秒) |
延遲75%(毫秒) |
延遲平均(毫秒) |
|
blacksheep 1.0.3 |
13805 |
3.71 |
6.29 |
4.61 |
|
muffin 0.70 |
12636 |
4.02 |
6.97 |
5.04 |
|
falcon 3.0.0 |
11495 |
4.43 |
7.62 |
5.54 |
|
starlette 0.14.2 |
10599 |
4.77 |
8.22 |
6.01 |
|
emmett 2.2.1 |
9922 |
5.06 |
8.88 |
6.42 |
|
Fastapi 0.63.0 |
7262 |
6.89 |
12.15 |
8.80 |
|
Sanic 21.3.4 |
6360 |
7.89 |
13.76 |
10.05 |
|
aiohttp 3.7.4.post0 |
5088 |
12.40 |
12.88 |
12.58 |
|
quart 0.14.1 |
2771 |
21.87 |
25.84 |
23.09 |
|
django 3.2 |
1368 |
45.20 |
52.33 |
46.72 |
解析上傳的文件,將其存儲(chǔ)在磁盤(pán)上并返回文本響應(yīng)
該測(cè)試模擬多部分表單數(shù)據(jù)處理并處理文件。按最大請(qǐng)求數(shù)/秒排序
|
框架 |
請(qǐng)求/秒 |
延遲50%(毫秒) |
延遲75%(毫秒) |
延遲平均(毫秒) |
|
blacksheep 1.0.3 |
4160 |
12.11 |
21.48 |
16.12 |
|
muffin 0.70 |
3203 |
15.87 |
27.90 |
19.96 |
|
falcon 3.0.0 |
3042 |
16.68 |
28.77 |
21.02 |
|
starlette 0.14.2 |
2747 |
18.59 |
31.54 |
23.34 |
|
emmett 2.2.1 |
1949年 |
25.65 |
45.74 |
32.79 |
|
Fastapi 0.63.0 |
1793年 |
27.77 |
49.93 |
35.64 |
|
Sanic 21.3.4 |
1788年 |
35.60 |
36.36 |
35.79 |
|
aiohttp 3.7.4.post0 |
1207 |
49.96 |
58.89 |
52.96 |
|
quart 0.14.1 |
1095 |
58.92 |
61.70 |
58.36 |
|
django 3.2 |
776 |
80.86 |
93.00 |
82.32 |
解析路徑參數(shù),查詢(xún)字符串,JSON正文并返回JSON響應(yīng)
該測(cè)試模擬一個(gè)簡(jiǎn)單的JSON REST API端點(diǎn)。按最大要求/秒排序
|
框架 |
請(qǐng)求/秒 |
延遲50%(毫秒) |
延遲75%(毫秒) |
延遲平均(毫秒) |
|
blacksheep 1.0.3 |
7499 |
6.74 |
12.06 |
8.51 |
|
muffin 0.70 |
7232 |
6.93 |
12.29 |
8.83 |
|
falcon 3.0.0 |
7070 |
7.05 |
12.58 |
9.02 |
|
starlette 0.14.2 |
5602 |
8.95 |
15.91 |
11.40 |
|
emmett 2.2.1 |
5379 |
9.19 |
16.35 |
11.89 |
|
Fastapi 0.63.0 |
5126 |
9.66 |
17.36 |
12.50 |
|
Sanic 21.3.4 |
4406 |
11.30 |
20.27 |
14.50 |
|
aiohttp 3.7.4.post0 |
3232 |
19.70 |
20.24 |
19.81 |
|
quart 0.14.1 |
1767 |
36.32 |
38.11 |
36.19 |
|
django 3.2 |
1146 |
54.00 |
62.70 |
55.80 |
綜合統(tǒng)計(jì)
綜合基準(zhǔn)測(cè)試結(jié)果
按已完成的請(qǐng)求排序
|
框架 |
請(qǐng)求已完成 |
平均延遲50%(毫秒) |
平均延遲75%(毫秒) |
平均延遲(毫秒) |
|
blacksheep 1.0.3 |
381960 |
7.52 |
13.28 |
9.75 |
|
muffin 0.70 |
343635 |
8.98 |
15.82 |
11.34 |
|
falcon 3.0.0 |
322110 |
9.98 |
17.15 |
12.57 |
|
starlette 0.14.2 |
272250 |
13.12 |
23.29 |
16.73 |
|
emmett 2.2.1 |
243825 |
21.56 |
28.38 |
23.96 |
|
Fastapi 0.63.0 |
221715 |
11.25 |
19.63 |
14.32 |
|
Sanic 21.3.4 |
201915 |
15.32 |
27.45 |
19.65 |
|
aiohttp 3.7.4.post0 |
151620 |
22.57 |
23.16 |
22.73 |
|
quart 0.14.1 |
84495 |
39.04 |
41.88 |
39.21 |
|
django 3.2 |
49350 |
60.02 |
69.34 |
61.61 |






