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

目录
  • 概述
    • 先说结果
    • 测试环境
    • 测试结果
    • 示例代码
    • 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})

总结

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

(0)

相关推荐

  • Django Celery异步任务队列的实现

    背景 在开发中,我们常常会遇到一些耗时任务,举个例子: 上传并解析一个 1w 条数据的 Excel 文件,最后持久化至数据库. 在我的程序中,这个任务耗时大约 6s,对于用户来说,6s 的等待已经是个灾难了. 比较好的处理方式是: 接收这个任务的请求 将这个任务添加到队列中 立即返回「操作成功,正在后台处理」的字样 后台消费这个队列,执行这个任务 我们按照这个思路,借助 Celery 进行实现. 实现 本文所使用的环境如下: Python 3.6.7 RabbitMQ 3.8 Celery 4.

  • python异步的ASGI与Fast Api实现

    目录 ASGI框架 ASGI服务器 FastAPI 总结 Asgi是异步通信服务规范.客户端发起服务呼叫,但不等待结果.调用方立即继续其工作,并不关心结果.如果调用方对结果感兴趣,有一些机制可以让其随时被回调方法返回结果. ASGI尝试保持在一个简单的应用接口的前提下,提供允许数据能够在任意的时候.被任意应用进程发送和接受的抽象.并且同样描述了一个新的,兼容HTTP请求响应以及WebSocket数据帧的序列格式.允许这些协议能通过网络或本地socket进行传输,以及让不同的协议被分配到不同的进程

  • 使用celery和Django处理异步任务的流程分析

    介绍 我们可能需要一些可以安排一些任务并定期运行一些任务或异步处理长任务的东西,而这一切都可以通过在Django Project中使用Celery来实现. 什么是Celery? Celery是 一个专注于实时处理的任务队列,它还支持任务调度. Celery快速,简单,高度可用且灵活. Celery需要消息传输来发送和接收消息,这可以由Redis或RabbitMQ完成. 入门 让我们开始在您的virtualenv中安装Celery软件包. 安装Celery <span class="nv&q

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

    目录 概述 先说结果 测试环境 测试结果 示例代码 django代码如下 总结 概述 据说fastapi是目前最快的异步框架,遂决定将其和django异步进行并发比较. 先说结果 fastapi的异步可以使整体运行速度非常均衡,不会出现较大波动,但是django会出现大量的波动问题,部分访问速度很快,但是部分访问速度很慢,甚至超时. 个人感觉是因为django的数据库访问是同步的,但是fastapi我是用的异步数据库访问.(django不支持异步数据库访问) 在长时间并发情况下,fastapi的

  • 对比分析Django的Q查询及AngularJS的Datatables分页插件

    使用Q查询,首先要导入Q模块: from django.db.models import Q 可以组合使用&,|操作符用于多个Q的对象,产生一个新的Q对象,Q对象也可以用~操作符放在前面表示否定,如下例所示: if search: keywords_list = search.split(' ') query_list = [Q(status__icontains=get_success_fail_status(keyword)) if get_success_fail_keyword_stat

  • Django bulk_create()、update()与数据库事务的效率对比分析

    下面以创建10000个对象为例进行测试: # 用for循环挨个创建,共花费37秒 for i in range(10000): name="String number %s"%i Record.objects.create(name=name) # 用django事务只提交一次,共花费2.65秒 @transaction.commit_manually def manual_transaction(): for i in range(10000): name="String

  • 详解Django中的FBV和CBV对比分析

    在学习Django过程中在views.py进行逻辑处理时接触到了两种视图的书写风格,FBV和CBV FBV 指 function based views,即基于函数的视图 CBV 指 class based views,即基于类的视图 基于类的视图相较于基于函数的视图可以更加便利的实现类的继承封装等.在日常使用的时候,二者的区别主要在于对于request的请求方法的处理方式 FBV 我们通过函数传入的request的method来判断客户端发起的是什么请求,并进行相应的操作,返回相应的数据. d

  • .Net Core内存回收模式及性能测试对比分析

    .NET Core 两种GC模式: Server GC / Workstation GC Server GC : 主要应用于多处理器系统,并且作为ASP.NET Core宿主的默认配置.它会为每个处理器都创建一个GC Heap,并且会并行执行回收操作.该模式的GC可以最大化吞吐量和较好的收缩性.这种模式的特点是初始分配的内存较大,并且尽可能不回收内存,进行回收用时会很耗时,并进行内存碎片整理工作.用一句简单的话说,这个就是贪婪模式,通过尽可能多的获得内存和少回收来得到更好的性能.结果就是高内存使

  • Go/Python/Erlang编程语言对比分析及示例代码

    本文主要是介绍Go,从语言对比分析的角度切入.之所以选择与Python.Erlang对比,是因为做为高级语言,它们语言特性上有较大的相似性,不过最主要的原因是这几个我比较熟悉. Go的很多语言特性借鉴与它的三个祖先:C,Pascal和CSP.Go的语法.数据类型.控制流等继承于C,Go的包.面对对象等思想来源于Pascal分支,而Go最大的语言特色,基于管道通信的协程并发模型,则借鉴于CSP分支. Go/Python/Erlang语言特性对比 如<编程语言与范式>一文所说,不管语言如何层出不穷

  • java协程框架quasar和kotlin中的协程对比分析

    目录 前言 快速体验 添加依赖 添加javaagent 线程VS协程 协程代码 多线程代码 协程完胜 后记 前言 早就听说Go语言开发的服务不用任何架构优化,就可以轻松实现百万级别的qps.这得益于Go语言级别的协程的处理效率.协程不同于线程,线程是操作系统级别的资源,创建线程,调度线程,销毁线程都是重量级别的操作.而且线程的资源有限,在java中大量的不加限制的创建线程非常容易将系统搞垮.接下来要分享的这个开源项目,正是解决了在java中只能使用多线程模型开发高并发应用的窘境,使得java也能

  • 关于Python与Golang语言的对比分析

    目录 一:前言 二:特点 1.Python ①解释型语言 ②动态数据类型 ③完全面向对象的语言 ④拥有强大的标准库 ⑤社区提供了大量第三方库 2.Golang ①静态强类型.编译型.并发型 ②垃圾回收机制 ③支持面向对象编程 ④丰富的标准库 ⑤内嵌C支持 三:应用 1.Python 2.Golang 一:前言 刚看了一篇软文,说什么“才华是改变人生最有效的途径”,反正呢,大体就是科技进步,要想一直在车上,就得不断的学习,刚好最近也准备学习Golang,最近火的不能在火了吧,刚好也有些Python

  • Go语言如何高效的进行字符串拼接(6种方式对比分析)

    目录 前言 string类型 字符串拼接的6种方式及原理 原生拼接方式"+" 字符串格式化函数fmt.Sprintf Strings.builder bytes.Buffer strings.join 切片append Benchmark对比 结论 总结 前言 日常业务开发中离不开字符串的拼接操作,不同语言的字符串实现方式都不同,在Go语言中就提供了6种方式进行字符串拼接,那这几种拼接方式该如何选择呢?使用那个更高效呢?本文我们就一起来分析一下. 本文使用Go语言版本:1.17.1 s

  • AngularJS下对数组的对比分析

    Javascript不能直接用==或者===来判断两个数组是否相等,无论是相等还是全等都不行,以下两行JS代码都会返回false <script type="text/javascript"> alert([]==[]); alert([]===[]); </script> 要判断JS中的两个数组是否相同,需要先将数组转换为字符串,再作比较.以下两行代码将返回true <script type="text/javascript">

随机推荐