0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Flask如何升级到 Quart 应用程序

科技绿洲 来源:Python实用宝典 作者:Python实用宝典 2023-11-01 16:23 次阅读

本文详细介绍了典型的生产环境的 CRUD 应用程序从 Flask 到 Quart 的转换,并展示相关的性能改进优势。

将这个 Flask-pyscopg2 应用程序升级到 Quart-asyncpg 应用程序可以提高 3 倍的性能,而且不需要对代码进行重大的重写或调整。

图片

如上所示,在针对单个资源详情的请求下,Flask每秒请求为330个,而quart能达到1160个。以此类推,Quart 相比于 Flask 平均性能提高3倍。

这个比较,我使用了一个简单的只提供一个 RESTful 接口的应用程序,这是微服务架构中的常见用例。

该应用程序有三个路由。这些路由分别是:

  • 单个电影详情:GET /films/pk/
  • 所有电影:GET /films/
  • 添加新评论:POST /reviews/

源代码可以在以下网址找到:
https://github.com/pgjones/faster_than_flask_article

有两个 commit ,分别是一个 Flask 版本和一个Quart 版本。

1. 从 Flask 到 Quart

从 Flask 改用 Quart 很容易,只需要一点点改变,特别是 from flask 改为 from quart,函数变成异步函数。

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

变成

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

**

2.数据库连接,从 psycopg2 到 asyncpg**

从 psycopg2 改用 asyncpg 比较麻烦,因为两者有不同的用法。

为了简化区别,我们在 Flask 应用程序中使用了 PoolWrapper,使得 psycopg2 可以使用与 asyncpg 相同的 API 进行上下文管理,即:

with pool.acquire() as connection:

这将允许通过with更改为async with来使用asyncpg。

当然,除了连接之外,Asyncpg和psycopg2还在游标使用、事务、执行参数和查询格式方面存在差异。这些差异是你在迁移过程中需要注意的。

3.部署

Flask 应用程序往往不能直接在生产环境中直接暴露给用户,这是因为Flask 本身一次只能处理一个请求。因此,常常用WSGI服务器与某种异步 worker 结合使用,例如 带 eventlet 的Gunicorn。

Quart 也可以用 Gunicorn 部署,它允许使用相同的命令来运行 Flask 和 Quart 应用程序:

$ gunicorn --config gunicorn.py 'run:create_app()'
针对 Flask 和 Quart 的性能测试是基于 Gunicorn 进行的。

4.添加测试数据

除了添加一个简单的 review 表之外,Postgresql 示例数据库还要为应用程序提供一些用于 CRUD的数据。

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

5.性能测试

为了测量应用程序的性能,我们使用了wrk。它被配置为使用20个连接,以匹配数据库连接池的大小(确保最高的吞吐量,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.系统信息与结果

系统信息:

Postgres (9.5.10),wrk (4.0.0),Python (3.6.3),asyncpg (0.13.0),Flask (0.12.2),Gunicorn (19.7.1),psycopg2 (2.7.3.2), Quart (0.3.1)

全部运行在一台 AWS c4.large 机器上。

结果

图片

请注意,Quart 服务器的平均等待时间减少了 2 至 3.5 倍,每秒的请求数量增加了 2 至 3.5 倍。

7.结论

Flask 应用程序升级到 Quart 应用程序是相当简单的,因为大部分 API 是共享的,所以主要工作就是在正确的位置写asyncawait。然而,如果使用 SQLAlchemy(或其他 ORM),则从psycopg2 到 asyncpg 的改变会比较复杂,并且可能会很麻烦。

这个 demo 应用程序的性能显着提高,这个改进主要是由于 Quart 使用了 asyncpg 和 uvloop,据估计,仅 Quart 就能提供 1.5 倍的提升。

总之,从 Flask-psycopg2 应用程序升级到 Quart-asyncpg 应用程序的比较简单,并拥有非常合理的性能改进。这可能会扩展到其他基于 asyncio 的库,意味着将 Flask 应用程序转换到 asyncio 生态系统,Quart 只需要很小的工作量。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 接口
    +关注

    关注

    33

    文章

    7648

    浏览量

    148529
  • 应用程序
    +关注

    关注

    37

    文章

    3136

    浏览量

    56412
  • flask
    +关注

    关注

    0

    文章

    16

    浏览量

    3575
收藏 人收藏

    评论

    相关推荐

    如何让KeilUlink升级到ULINK2

    如何让KeilUlink升级到ULINK2
    发表于 02-12 20:05

    FatFS升级到0.12c版本

    FatFS升级到0.12c版本
    发表于 03-31 11:03

    FatFS升级到0.13a版本

    本帖最后由 lee_st 于 2017-10-31 09:22 编辑 FatFS升级到0.13a版本
    发表于 10-22 13:49

    升级到352.70

    嗨 - 这是我们当前的版本:Esxi vGPU经理= 346.58赢7 = 348.27我们正在尝试升级到当前版本:Esxi-352.70赢7/8-354.56遇到问题。我将Esxi方面升级到
    发表于 09-07 16:47

    labview怎么从2015升级到2017

    labview怎么从2015升级到2017?
    发表于 03-15 16:31

    无线升级到802.11n的考虑因素

    的问题"是否升级到新的标准下,以及什么时间、以什么样的方式升级"。下面内容将指出升级到802.11n应该考虑哪些因素来最大化利益,最大化迁移带来的影响。
    发表于 07-16 06:17

    请问SP601板可以升级到LX45吗?

    SP601板可以升级到LX45吗?常见问题解答不明确:6.我可以升级到更大或更快的设备吗?答:是的,您可以但这样做会使Xilinx保修失效,并且不会提供对电路板的支持。通常,CS324封装允许将板载FPGA升级到LX25,但不支
    发表于 08-22 10:27

    Mac升级到1012基础编译无法工作

    Mac 升级到1012 出现的各种问题解决
    发表于 03-23 11:17

    升级到Windows7的理由是什么?

    升级到Windows7的理由是什么?
    发表于 04-28 06:28

    如何把linux默认的4.1.15内核升级到4.9.88?

    各位大侠,知道怎么把当前默认的4.1.15内核升级到4.9.88的方法么?我现在用的是imx6 Q核心板。
    发表于 01-10 07:26

    MounRiver升级到1.82,固件升级后提示错误怎么解决?

    如题。芯片是CH582. 一直用得好好的。今天MounRiver升级到1.82,问我要不要升级WCH-link固件。我随便说要(严重错误!!)。固件升级后调试时出现如下提示:马上要交功课了。在线等解决方法。
    发表于 09-29 07:16

    怎样创建树莓派上的Web应用程序 并使用Flask Web Framework控制伺服电机

    在这篇文章中,您将学习如何创建Raspberry Pi上的Web应用程序,使用Flask Web Framework控制伺服电机,以创建Web应用程序。我们将在Web应用程序上创建两个
    的头像 发表于 07-26 15:27 6247次阅读

    使用Python和Flask开发一个Web程序

    Flask 是一个使用 Python 语言编写的 Web 框架,它可以让你高效的编写 Web 程序。Web 程序即“网站”或“网页程序”,是指可以通过浏览器进行交互的
    发表于 02-28 08:00 0次下载

    Flask入门教程之使用Python和Flask开发一个Web程序

    Flask 是一个使用 Python 语言编写的 Web 框架,它可以让你高效的编写 Web 程序。Web 程序即“网站”或“网页程序”,是指可以通过浏览器进行交互的
    发表于 03-11 08:00 0次下载

    在Python中使用Flask运行的Web应用程序来模拟钢琴

    电子发烧友网站提供《在Python中使用Flask运行的Web应用程序来模拟钢琴.zip》资料免费下载
    发表于 11-28 09:29 2次下载
    在Python中使用<b class='flag-5'>Flask</b>运行的Web<b class='flag-5'>应用程序</b>来模拟钢琴