开发者

fastapi与django异步的并发对比分析

开发者 https://www.devze.com 2023-03-16 09:17 出处:网络 作者: Chise1
目录概述先说结果测试环境测试结果示例代码django代码如下总结概述 据说fastapi是目前最快的异步框架,遂决定将其和django异步进行并发比较。
目录
  • 概述
    • 先说结果
    • 测试环境
    • 测试结果
    • 示例代码
    • django代码如下
  • 总结

    概述

    据说fastapi是目前最快的异步框架,遂决定将其和django异步进行并发比较。

    先说结果

    fastapi的异步可以使整体运行速度非常均衡,不会出现较大波动,但是django会出现大量的波动问开发者_JAVA入门题,部分访问速度很快,但是部分访问速度很慢,甚至超时。

    个人感觉是因为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与django异步的并发对比分析

    fastapi与django异步的并发对比分析

    示例代码

    #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@phttp://www.devze.comostgresserver/db"
    
    database = databases.Database(DATABASE_URL)
    
    metadata = sqlalchemy.MetaData()
    
    notes = sqlalchemy.Table(
        "notes",
        metadata,
        sqlalchemy.Column("id", sqlalcheandroidmy.Integer, primary_key=True),
        sqlalchemy.Column("text", sqlalchemy.String),
        sqlalchemy.Column("completed", sqlalchemy.Boolean),
    )
    
    engine = sqlalchemy.create_engine(
        DATABASE_URL, connectphp_args={"ch编程客栈eck_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)
    asyjavascriptnc 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})
    

    总结

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

    0

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    关注公众号