Python异步编程之web框架 异步vs同步 数据库IO任务压测对比
2023/6/8 11:53:49
本文主要是介绍Python异步编程之web框架 异步vs同步 数据库IO任务压测对比,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
测试基本信息
主题:比较异步框架和同步框架在数据库IO操作的性能差异
python版本:python 3.8
数据库:mysql 8.0.27 (docker部署)
压测工具:locust
web框架:同步:flask 异步:starlette
请求并发量: 模拟10个用户
服务器配置: Intel(R) i7-12700F
客户端配置:Intel(R) i7-8700 3.20GHz
flask 同步框架
python中操作数据库通常使用ORM框架完成。flask 使用的ORM框架是大名鼎鼎的sqlalchemy,该框架是所有ORM框架中生态最完善的,但是sqlalchemy对异步的支持并不算友好,目前支持原生SQL操作。
定义表结构
from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import create_engine, Column, Integer, String DB_URI = "mysql+pymysql://root:123456@127.0.0.1:3306/test" engine = create_engine(DB_URI) Base = declarative_base(engine) # SQLORM基类 class Student(Base): __tablename__ = 'student' # 表名 id = Column(Integer, primary_key=True, autoincrement=True) name = Column(String(50)) Base.metadata.create_all() # 将模型映射到数据库中
api接口
from flask import Flask, request from sqlalchemy.orm import sessionmaker from model import Student, engine, Base app = Flask(__name__) @app.route('/users') def list_all(): session = sessionmaker(engine)() # 构建session对象 students = session.query(Student).all() res = [stu.name for stu in students] session.close() return res @app.route("/user", methods=["POST"]) def create(): session = sessionmaker(engine)() # 构建session对象 student = Student(name='Tony') # 创建一个student对象 session.add(student) # 添加到session session.commit() # 提交到数据库 session.close() return {"res":"success"} if __name__ == '__main__': app.run(port=8090, host="0.0.0.0")
接口调用
post请求
get 请求:
压测结果
并发量:225
starlette 异步框架
starlette 异步框架配套使用的ORM框架是 tortoise-orm。tortoise-orm 是一款方便、易用、可靠的异步ORM框架,文档:https://tortoise.github.io/
安装数据库
pip install tortoise-orm pip install aiomysql
定义表结构
from tortoise import fields, models class Users(models.Model): id = fields.IntField(pk=True) username = fields.CharField(max_length=20) def __str__(self) -> str: return f"User {self.id}: {self.username}"
api接口
from model import Users from starlette.applications import Starlette from tortoise.contrib.starlette import register_tortoise from starlette.requests import Request from starlette.responses import JSONResponse from uvicorn.main import run app = Starlette() # 查询记录 @app.route("/user", methods=["GET"]) async def list_all(_: Request): users = await Users.all() return JSONResponse({"users": [str(user) for user in users]}) # 创建记录 @app.route("/user", methods=["POST"]) async def create(request: Request): body = await request.json username = body.get("user_name") user = await Users.create(username=username) return JSONResponse({"ret":"success"}) # 表迁移 register_tortoise(app, db_url="mysql://root:123456@127.0.0.1:3306/test", modules={"models": ["model"]}, generate_schemas=True) if __name__ == "__main__": run(app, host="0.0.0.0")
接口调用
post请求创建一个用户
get请求
压测结果
并发量:1496
性能对比
并发曲线图对比:
参数对比:
框架 | 数据库IO | 延迟 | 纯框架无IO | 文件IO |
---|---|---|---|---|
fastapi | 225 | 47 ms | 463 | 453 |
starlette | 1496 | 6 ms | 1539 | 1538 |
总结
在数据库读写方面,异步框架性能是同步框架的6倍,可以看出同步框架在数据库读写频繁时性能下降明显,几乎是无IO读写的一半,而异步框架在有数据库IO的情况下并发几乎保持不变。主要原因是在当前简单的场景下数据库读操作耗时少而连接释放耗时较多,异步编程非阻塞模型不等待,所以数据库连接释放耗时并不阻塞异步框架。下一篇比较redis IO的并发性能。
连载一系列关于python异步编程的文章。包括同异步框架性能对比、异步事情驱动原理等。首发微信公众号,欢迎关注第一时间阅读。
这篇关于Python异步编程之web框架 异步vs同步 数据库IO任务压测对比的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-14获取参数学习:Python编程入门教程
- 2024-11-14Python编程基础入门
- 2024-11-14Python编程入门指南
- 2024-11-13Python基础教程
- 2024-11-12Python编程基础指南
- 2024-11-12Python基础编程教程
- 2024-11-08Python编程基础与实践示例
- 2024-11-07Python编程基础指南
- 2024-11-06Python编程基础入门指南
- 2024-11-06怎么使用python 计算两个GPS的距离功能-icode9专业技术文章分享