衡阳派盒市场营销有限公司

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

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

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

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

科技綠洲 ? 來(lái)源: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)勢(shì)。

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

圖片

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

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

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

  • 單個(gè)電影詳情:GET /films/pk/
  • 所有電影:GET /films/
  • 添加新評(píng)論:POST /reviews/

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

有兩個(gè) commit ,分別是一個(gè) Flask 版本和一個(gè)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ù)庫(kù)連接,從 psycopg2 到 asyncpg**

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

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

with pool.acquire() as connection:

這將允許通過(guò)with更改為async with來(lái)使用asyncpg。

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

3.部署

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

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

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

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

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

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

5.性能測(cè)試

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

測(cè)試 GET 請(qǐng)求的命令是

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

測(cè)試 POST 請(qǐng)求的命令是

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

測(cè)試使用的 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)行在一臺(tái) AWS c4.large 機(jī)器上。

結(jié)果

圖片

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

7.結(jié)論

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

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

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

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

    關(guān)注

    33

    文章

    8694

    瀏覽量

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

    關(guān)注

    38

    文章

    3292

    瀏覽量

    57918
  • flask
    +關(guān)注

    關(guān)注

    0

    文章

    16

    瀏覽量

    3634
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    如何把iPhone OS升級(jí)到3.1.3

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

    ESP8266 12E如何升級(jí)到最新固件?

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

    如何讓KeilUlink升級(jí)到ULINK2

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

    FatFS升級(jí)到0.12c版本

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

    升級(jí)到352.70

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

    labview怎么從2015升級(jí)到2017

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

    無(wú)線升級(jí)到802.11n的考慮因素

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

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

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

    升級(jí)到Windows7的理由是什么?

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

    MounRiver升級(jí)到1.82,固件升級(jí)后提示錯(cuò)誤怎么解決?

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

    iphone4升級(jí)5.1.1教程_iphone4如何升級(jí)到ios5

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

    怎樣創(chuàng)建樹(shù)莓派上的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)建兩個(gè)
    的頭像 發(fā)表于 07-26 15:27 ?6679次閱讀

    使用Python和Flask開(kāi)發(fā)一個(gè)Web程序

    Flask 是一個(gè)使用 Python 語(yǔ)言編寫(xiě)的 Web 框架,它可以讓你高效的編寫(xiě) Web 程序。Web 程序即“網(wǎng)站”或“網(wǎng)頁(yè)程序”,是指可以通過(guò)瀏覽器進(jìn)行交互的
    發(fā)表于 02-28 08:00 ?0次下載

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

    電子發(fā)燒友網(wǎng)站提供《在Python中使用Flask運(yùn)行的Web應(yīng)用程序來(lái)模擬鋼琴.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>來(lái)模擬鋼琴

    升級(jí)到TVP5147M1

    電子發(fā)燒友網(wǎng)站提供《升級(jí)到TVP5147M1.pdf》資料免費(fèi)下載
    發(fā)表于 09-30 09:08 ?0次下載
    <b class='flag-5'>升級(jí)到</b>TVP5147M1
    龙虎斗网站| 百家乐官网娱乐网站| 澳门百家乐官网心得玩博| 葡京百家乐官网的玩法技巧和规则| 网上百家乐赌钱| 百家乐平注胜进与负追| 大发888在线赌场网站| 囊谦县| 网上百家乐官网娱乐场开户注册| 百家乐游戏源码手机| 皇冠代理网| 百家乐官网赌博现金网| 百家乐视频游戏会员| 大发888被查封| 至尊百家乐官网20111110| 百家乐视频下载地址| 棋牌58w| 德州扑克大小| 博之道百家乐官网技巧| 百家乐高手怎么下注| 188金宝博娱乐城| 百家乐官网视频画面| 大发888娱乐城rfgjdf888bg| 百家乐官网视频下载地址| 网上百家乐官网骗钱| 娱乐城百家乐的玩法技巧和规则| 百家乐官网怎样算大小| 百家乐电话投注多少| 宽甸| 百家乐娱乐城优惠| 肯博88国际网| 百家乐的嬴钱法| 大发游戏| 综合百家乐官网博彩论坛| 水果机技巧| 百家乐官网线上真人游戏| 亚洲百家乐论坛| 专业百家乐官网分析| 永利百家乐娱乐平台| 旬邑县| 电投百家乐网站|