fastapi与django异步的并发对比分析
作者:Chise1 发布时间:2023-01-03 19:49:30
标签:fastapi,django,异步,并发
概述
据说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


猜你喜欢
- 定义一个banner.js文件,代码如下;window.requestAnimationFrame = window.requestAnim
- 基本开发环境· Python 3.6· Pycharm相关模块使用目标网页分析输入想看的小说内容,点击搜索这里会返回很多结果,我只选择第一个
- 相信大家对街边林林总总的房产中介并不陌生,那么我们先看看下面这张图片。图1从右侧这家店的橱窗里,我们能迅速分清哪些是租房信息哪些是售房信息。
- 前言matplotlib 是Python最著名的绘图库,它提供了一整套和matlab相似的命令API,十分适合交互式地进行制图。本文将以例子
- 一图胜“十”言:SQL Server 数据库总结 一个大概的总结 经过一段时间的学习,也对数据库有了一些认识。 数据库基本是由表,关系,操作
- 1、查询锁情况select sid,serial#,event,BLOCKING_SESSION from v$session where
- SQL Server vNext CTP 1.2安装教程:此安装过程参考微软官方的安装文档:https://docs.micro
- 在SQL SERVER中如何通过SQL语句获取服务器硬件和系统信息呢?下面介绍一下如何通过SQL语句获取处理器(CPU)、内存(Memory
- 近期线上出现一个bug,研发的小伙伴把测试环境的地址写死到代码中,在上线前忘记修改,导致线上发布的代码中使用了测试环境地址。开发过程中虽然有
- Python中的五种特性:切片,迭代,列表生成式,生成器,迭代器。切片切片就相当于其他语言中的截断函数,取部分指定元素用的。L = list
- python的os module中有fork()函数用于生成子进程,生成的子进程是父进程的镜像,但是它们有各自的地址空间,子进程复制一份父进
- 前言本文主要给大家介绍了关于python图片添加半透明水印的相关资料,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧示例代码
- LEN()函数获取字符串的长度。LEN( <字符> )--返回整型SUBSTRING()函数截取字符内指定位置、指定内容的字符。
- mysql-5.7.23-winx64 解压版详细安装教程,供大家参考,具体内容如下1、Click here to download Mys
- 本文介绍了目前6种比较常用的进度条,让大家都能直观地看到脚本运行最新的进展情况1.普通进度条在代码迭代运行中可以自己进行统计计算,并使用格式
- 前言个人感觉骨架提取提取的就是开运算过程的不可逆。一.算法步骤1.算法步骤首先上一下比较官方的算法步骤:1.获得原图像的首地址及图像的宽和高
- 目录1、生成器2、迭代器与可迭代的生成器1、生成器现在可以通过生成器来直接创建一个列表,但是由于内存的限制,列表的容量肯定是有限的,如果我们
- go设置GOROOT和GOPATHgo 里面有两个非常重要的环境变量 GOROOT 和 GOPATH,其中 GOROOT 是安装 go 的路
- 简单低级的爬虫速度快,伪装度低,如果没有反爬机制,它们可以很快的抓取大量数据,甚至因为请求过多,造成服务器不能正常工作。而伪装度高的爬虫爬取
- 即使打开了strict和warnings选项也无妨,下面代码并无错误和警告。#!/usr/bin/perluse strict;use wa