fastapi与django异步的并发对比分析
作者:Chise1 时间:2023-01-03 19:49:30
概述
据说fastapi是目前最快的异步框架,遂决定将其和django异步进行并发比较。
先说结果
fastapi的异步可以使整体运行速度非常均衡,不会出现较 * 动,但是django会出现大量的波动问题,部分访问速度很快,但是部分访问速度很慢,甚至超时。
个人感觉是因为django的数据库访问是同步的,但是fastapi我是用的异步数据库访问。(django不支持异步数据库访问)
在长时间并 * 况下,fastapi的运行状态非常稳定,但是django的运行速度不行(另外我发现runserver运行虽然慢,但是至少测试能成功,daphne并发量大了测试直接失败。。)。(之后还会考虑pypy的测试和其他情况的)
测试环境
阿里云
服务器: 2 vCPU 4 GiB (I/O优化) ecs.c5.large 4Mbps
数据库:rds.mysql.s1.small
服务器和数据库都在华北三
测试指令:
ab -n 10000 -c 1000 http://127.0.0.1:8002/get_update_info
在更大并发和更长时间的情况下daphne测试报错,就算设置-k也报错,但是fastapi能够很稳定的响应。
测试结果
示例代码
#fastapi
# -*- encoding: utf-8 -*-
"""
@File : test2.py
@Time : 2020/3/13 14:21
@Author : chise
@Email : chise123@live.com
@Software: PyCharm
@info :
"""
from typing import List
import databases
import sqlalchemy
from fastapi import FastAPI
from pydantic import BaseModel
# SQLAlchemy specific code, as with any other app
DATABASE_URL = "mysql+pymysql://......"
# DATABASE_URL = "postgresql://user:password@postgresserver/db"
database = databases.Database(DATABASE_URL)
metadata = sqlalchemy.MetaData()
notes = sqlalchemy.Table(
"notes",
metadata,
sqlalchemy.Column("id", sqlalchemy.Integer, primary_key=True),
sqlalchemy.Column("text", sqlalchemy.String),
sqlalchemy.Column("completed", sqlalchemy.Boolean),
)
engine = sqlalchemy.create_engine(
DATABASE_URL, connect_args={"check_same_thread": False}
)
app = FastAPI()
@app.on_event("startup")
async def startup():
await database.connect()
@app.on_event("shutdown")
async def shutdown():
await database.disconnect()
class D(BaseModel):
id: int
info: str
data: str
@app.get('/get_update_info', response_model=D)
async def get_update_info():
return await database.fetch_one("SELECT * FROM `publicadmin_updateinfo` LIMIT 1 ;")
if __name__ == "__main__":
import uvicorn
uvicorn.run(app,)
django代码如下
class UpdateInfo(models.Model):
info = models.TextField(verbose_name="更新日志")
data = models.TextField(verbose_name="主要内容")
# data = MDTextField(verbose_name="主要内容")
class Meta:
verbose_name = "公告栏"
verbose_name_plural = verbose_name
def get_update_info(request):
"""
更新日志
Args:
request:
Returns:
"""
info: UpdateInfo = UpdateInfo.objects.first()
return JsonResponse({"id": info.id, "msg": info.info, "main_info": info.data})
来源:https://blog.csdn.net/weixin_36179862/article/details/104857488
标签:fastapi,django,异步,并发


猜你喜欢
Python threading中lock的使用详解
2023-01-16 08:32:26
巧制可全屏拖动的图片
2008-05-09 19:34:00

Python字符串三种格式化输出
2022-12-15 09:47:59
json显示日期带T问题的解决方法
2022-05-12 16:50:37
CentOS7.3下mysql 8.0.13安装配置方法图文教程
2024-01-23 09:42:10
python 使用建议与技巧分享(四)
2021-06-29 20:43:28
使用apiDoc实现python接口文档编写
2023-10-23 21:28:40
基于Python创建语音识别控制系统
2021-08-29 14:02:10

pytest实现测试用例参数化
2023-12-10 19:01:21
MYSQL开启远程访问权限的方法
2024-01-14 02:17:04
IE8 的 JSON 解析 Bug
2009-05-22 12:36:00
Python 实现图片色彩转换案例
2021-01-12 21:35:56

Python利用GDAL模块实现读取栅格数据并对指定数据加以筛选掩膜
2021-02-16 00:49:31

python操作excel的包(openpyxl、xlsxwriter)
2023-05-22 09:12:07

JavaScript获取一个范围内日期的方法
2024-04-28 09:50:33
交互设计杂七杂八
2010-09-25 18:41:00

编写一个javascript元循环求值器的方法
2024-04-23 09:28:15
不能忽略c#中的using和as操作符的用处
2024-03-23 08:08:41
举例讲解Python面向对象编程中类的继承
2022-02-09 02:59:14
Golang编程实现删除字符串中出现次数最少字符的方法
2024-05-25 15:15:56