0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Flask如何升級到 Quart 應(yīng)用程序

科技綠洲 ? 來源:Python實(shí)用寶典 ? 作者:Python實(shí)用寶典 ? 2023-11-01 16:23 ? 次閱讀

本文詳細(xì)介紹了典型的生產(chǎn)環(huán)境的 CRUD 應(yīng)用程序從 Flask 到 Quart 的轉(zhuǎn)換,并展示相關(guān)的性能改進(jìn)優(yōu)勢。

將這個 Flask-pyscopg2 應(yīng)用程序升級到 Quart-asyncpg 應(yīng)用程序可以提高 3 倍的性能,而且不需要對代碼進(jìn)行重大的重寫或調(diào)整。

圖片

如上所示,在針對單個資源詳情的請求下,F(xiàn)lask每秒請求為330個,而quart能達(dá)到1160個。以此類推,Quart 相比于 Flask 平均性能提高3倍。

這個比較,我使用了一個簡單的只提供一個 RESTful 接口的應(yīng)用程序,這是微服務(wù)架構(gòu)中的常見用例。

該應(yīng)用程序有三個路由。這些路由分別是:

  • 單個電影詳情:GET /films/pk/
  • 所有電影:GET /films/
  • 添加新評論:POST /reviews/

源代碼可以在以下網(wǎng)址找到:
https://github.com/pgjones/faster_than_flask_article

有兩個 commit ,分別是一個 Flask 版本和一個Quart 版本。

1. 從 Flask 到 Quart

從 Flask 改用 Quart 很容易,只需要一點(diǎn)點(diǎn)改變,特別是 from flask 改為 from quart,函數(shù)變成異步函數(shù)。

def add_review():
    data = request.get_json()
    ...

變成

async def add_review():
    data = await request.get_json()
    ...

**

2.數(shù)據(jù)庫連接,從 psycopg2 到 asyncpg**

從 psycopg2 改用 asyncpg 比較麻煩,因?yàn)閮烧哂胁煌挠梅ā?/p>

為了簡化區(qū)別,我們在 Flask 應(yīng)用程序中使用了 PoolWrapper,使得 psycopg2 可以使用與 asyncpg 相同的 API 進(jìn)行上下文管理,即:

with pool.acquire() as connection:

這將允許通過with更改為async with來使用asyncpg。

當(dāng)然,除了連接之外,Asyncpg和psycopg2還在游標(biāo)使用、事務(wù)、執(zhí)行參數(shù)和查詢格式方面存在差異。這些差異是你在遷移過程中需要注意的。

3.部署

Flask 應(yīng)用程序往往不能直接在生產(chǎn)環(huán)境中直接暴露給用戶,這是因?yàn)镕lask 本身一次只能處理一個請求。因此,常常用WSGI服務(wù)器與某種異步 worker 結(jié)合使用,例如 帶 eventlet 的Gunicorn。

Quart 也可以用 Gunicorn 部署,它允許使用相同的命令來運(yùn)行 Flask 和 Quart 應(yīng)用程序:

$ gunicorn --config gunicorn.py 'run:create_app()'
針對 Flask 和 Quart 的性能測試是基于 Gunicorn 進(jìn)行的。

4.添加測試數(shù)據(jù)

除了添加一個簡單的 review 表之外,Postgresql 示例數(shù)據(jù)庫還要為應(yīng)用程序提供一些用于 CRUD的數(shù)據(jù)。

CREATE TABLE review (
    film_id INTEGER REFERENCES film(film_id),
    rating INTEGER
);

5.性能測試

為了測量應(yīng)用程序的性能,我們使用了wrk。它被配置為使用20個連接,以匹配數(shù)據(jù)庫連接池的大小(確保最高的吞吐量,20是我使用過的典型值)。命令如下:

測試 GET 請求的命令是

$ wrk --connections 20 --duration 5m http://localhost:5000/${PATH}/

測試 POST 請求的命令是

$ wrk --connections 20 --duration 5m --script post.lua http://localhost:5000/${PATH}/

測試使用的 post.lua 文件如下:

wrk.method = "POST"
wrk.body = '{"film_id": 995, "rating": 4}'
wrk.headers["Content-Type"] = "application/json"

6.系統(tǒng)信息與結(jié)果

系統(tǒng)信息:

Postgres (9.5.10),wrk (4.0.0),Python (3.6.3),asyncpg (0.13.0),F(xiàn)lask (0.12.2),Gunicorn (19.7.1),psycopg2 (2.7.3.2), Quart (0.3.1)

全部運(yùn)行在一臺 AWS c4.large 機(jī)器上。

結(jié)果

圖片

請注意,Quart 服務(wù)器的平均等待時間減少了 2 至 3.5 倍,每秒的請求數(shù)量增加了 2 至 3.5 倍。

7.結(jié)論

Flask 應(yīng)用程序升級到 Quart 應(yīng)用程序是相當(dāng)簡單的,因?yàn)榇蟛糠?API 是共享的,所以主要工作就是在正確的位置寫asyncawait。然而,如果使用 SQLAlchemy(或其他 ORM),則從psycopg2 到 asyncpg 的改變會比較復(fù)雜,并且可能會很麻煩。

這個 demo 應(yīng)用程序的性能顯著提高,這個改進(jìn)主要是由于 Quart 使用了 asyncpg 和 uvloop,據(jù)估計,僅 Quart 就能提供 1.5 倍的提升。

總之,從 Flask-psycopg2 應(yīng)用程序升級到 Quart-asyncpg 應(yīng)用程序的比較簡單,并擁有非常合理的性能改進(jìn)。這可能會擴(kuò)展到其他基于 asyncio 的庫,意味著將 Flask 應(yīng)用程序轉(zhuǎn)換到 asyncio 生態(tài)系統(tǒng),Quart 只需要很小的工作量。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 接口
    +關(guān)注

    關(guān)注

    33

    文章

    8611

    瀏覽量

    151252
  • 應(yīng)用程序
    +關(guān)注

    關(guān)注

    37

    文章

    3271

    瀏覽量

    57727
  • flask
    +關(guān)注

    關(guān)注

    0

    文章

    16

    瀏覽量

    3623
收藏 人收藏

    評論

    相關(guān)推薦

    如何把iPhone OS升級到3.1.3

    如何把iPhone OS升級到3.1.3 在此請各位已經(jīng)越獄的iPhone用戶奔走相告:千萬不要一
    發(fā)表于 02-08 09:20 ?1584次閱讀

    ESP8266 12E如何升級到最新固件?

    ESP8266 12E如何升級到最新固件
    發(fā)表于 07-22 07:03

    如何讓KeilUlink升級到ULINK2

    如何讓KeilUlink升級到ULINK2
    發(fā)表于 02-12 20:05

    FatFS升級到0.12c版本

    FatFS升級到0.12c版本
    發(fā)表于 03-31 11:03

    升級到352.70

    嗨 - 這是我們當(dāng)前的版本:Esxi vGPU經(jīng)理= 346.58贏7 = 348.27我們正在嘗試升級到當(dāng)前版本:Esxi-352.70贏7/8-354.56遇到問題。我將Esxi方面升級到
    發(fā)表于 09-07 16:47

    labview怎么從2015升級到2017

    labview怎么從2015升級到2017?
    發(fā)表于 03-15 16:31

    無線升級到802.11n的考慮因素

    的問題"是否升級到新的標(biāo)準(zhǔn)下,以及什么時間、以什么樣的方式升級"。下面內(nèi)容將指出升級到802.11n應(yīng)該考慮哪些因素來最大化利益,最大化遷移帶來的影響。
    發(fā)表于 07-16 06:17

    Mac升級到1012基礎(chǔ)編譯無法工作

    Mac 升級到1012 出現(xiàn)的各種問題解決
    發(fā)表于 03-23 11:17

    升級到Windows7的理由是什么?

    升級到Windows7的理由是什么?
    發(fā)表于 04-28 06:28

    如何把linux默認(rèn)的4.1.15內(nèi)核升級到4.9.88?

    各位大俠,知道怎么把當(dāng)前默認(rèn)的4.1.15內(nèi)核升級到4.9.88的方法么?我現(xiàn)在用的是imx6 Q核心板。
    發(fā)表于 01-10 07:26

    MounRiver升級到1.82,固件升級后提示錯誤怎么解決?

    如題。芯片是CH582. 一直用得好好的。今天MounRiver升級到1.82,問我要不要升級WCH-link固件。我隨便說要(嚴(yán)重錯誤?。。?。固件升級后調(diào)試時出現(xiàn)如下提示:馬上要交功課了。在線等解決方法。
    發(fā)表于 09-29 07:16

    iphone4升級5.1.1教程_iphone4如何升級到ios5

    iphone4如何升級到ios5?iphone4升級到ios5.1.1教程,iphone4怎么升級到ios5,小編在這里為大家介紹了iphone4升級到ios5的方法
    發(fā)表于 09-18 09:48 ?5w次閱讀
    iphone4<b class='flag-5'>升級</b>5.1.1教程_iphone4如何<b class='flag-5'>升級到</b>ios5

    怎樣創(chuàng)建樹莓派上的Web應(yīng)用程序 并使用Flask Web Framework控制伺服電機(jī)

    在這篇文章中,您將學(xué)習(xí)如何創(chuàng)建Raspberry Pi上的Web應(yīng)用程序,使用Flask Web Framework控制伺服電機(jī),以創(chuàng)建Web應(yīng)用程序。我們將在Web應(yīng)用程序上創(chuàng)建兩個
    的頭像 發(fā)表于 07-26 15:27 ?6619次閱讀

    在Python中使用Flask運(yùn)行的Web應(yīng)用程序來模擬鋼琴

    電子發(fā)燒友網(wǎng)站提供《在Python中使用Flask運(yùn)行的Web應(yīng)用程序來模擬鋼琴.zip》資料免費(fèi)下載
    發(fā)表于 11-28 09:29 ?2次下載
    在Python中使用<b class='flag-5'>Flask</b>運(yùn)行的Web<b class='flag-5'>應(yīng)用程序</b>來模擬鋼琴

    升級到TVP5147M1

    電子發(fā)燒友網(wǎng)站提供《升級到TVP5147M1.pdf》資料免費(fèi)下載
    發(fā)表于 09-30 09:08 ?0次下載
    <b class='flag-5'>升級到</b>TVP5147M1