FlaskFastAPIgunicornunicorn并发调用

Flask VS. FastAPI

Flask和FastAPI是Python中两种流行的Web框架,它们各自具有不同的特点和适用场景。以下是它们之间的一些主要区别:

1. 框架类型

  • Flask:Flask是一个轻量级的微框架,适合构建小型到中型的Web应用。它灵活且易于扩展,允许开发者根据需要添加各种插件。
  • FastAPI:FastAPI是一个现代的高性能Web框架,专注于构建API。它基于Python 3.7+的类型提示,支持异步编程,提供了更丰富的功能。

2. 性能

  • Flask:在处理同步请求方面表现良好,但在高并发和I/O密集型任务中性能可能不如FastAPI。
  • FastAPI:由于支持异步请求处理,FastAPI在性能上表现优越,能够轻松应对高负载的请求。

3. 异步支持

  • Flask:Flask本身不支持异步编程。如果需要异步功能,开发者需要使用额外的库或工具。
  • FastAPI:FastAPI原生支持异步编程,可以使用asyncawait来定义异步路由,使得处理并发请求更加高效。

4. 数据验证

  • Flask:Flask没有内置的数据验证功能,通常需要使用第三方库(如WTForms)来实现。
  • FastAPI:FastAPI利用Pydantic进行数据验证,能够自动处理请求参数和响应体的验证,大大减少了错误请求的发生。

5. 文档生成

  • Flask:Flask需要手动编写API文档或使用第三方库(如Flask-RESTPlus)来生成文档。
  • FastAPI:FastAPI自动生成交互式API文档(基于OpenAPI和Swagger UI),无需额外配置即可访问。

6. 社区和生态系统

  • Flask:Flask拥有一个成熟且庞大的社区,提供了丰富的第三方扩展和插件。
  • FastAPI:虽然相对较新,但FastAPI的社区正在快速增长,并逐渐形成了自己的生态系统。

7. 学习曲线

  • Flask:由于其简洁性,Flask通常被认为更容易上手,适合初学者。
  • FastAPI:由于采用了现代Python特性(如类型提示和异步编程),FastAPI的学习曲线可能相对陡峭,但一旦掌握,其开发效率会显著提高。

总结

选择Flask还是FastAPI取决于项目需求:
  • 如果你需要构建简单的Web应用或原型,并且希望快速上手,可以选择Flask
  • 如果你正在开发高性能的API,并且希望利用异步编程和自动化文档生成功能,FastAPI将是更好的选择。

这两个框架各有优势,可以根据具体情况进行选择。

gunicorn VS unicorn

gunicorn:

--workers: 指定启动的进程数;(每个进程都会加载一份模型!)

--threads: 指定每个进程启动的线程数;

python的话,由于GIL锁的作用,里面的API根本无法被并行执行的;

可被并行执行的方案:FastAPI + API都用async调用 + IO操作用await版本的 + threads设为大于1

 实例代码:

from fastapi import FastAPI
import asyncio

app = FastAPI()

# Asynchronous function that simulates a delay
async def simulate_long_task(task_id: int):
    print(f"Task {task_id} started...")
    await asyncio.sleep(5)  # Simulates a long-running task (non-blocking)
    print(f"Task {task_id} completed!")
    return f"Result of task {task_id}"

@app.get("/tasks/{task_id}")
async def run_task(task_id: int):
    result = await simulate_long_task(task_id)
    return {"task_id": task_id, "result": result}

if __name__ == "__main__":
    import uvicorn
    uvicorn.run(app, host="0.0.0.0", port=8000)

当第1个request执行到await asyncio.sleep(5)那里时,会放弃线程;从而第2个request开始执行run_task;

执行命令和结果:

curl http://localhost:8000/tasks/1 &
curl http://localhost:8000/tasks/2 &
curl http://localhost:8000/tasks/3 &

Task 1 started...
Task 2 started...
Task 3 started...
Task 1 completed!
Task 2 completed!
Task 3 completed!

以上案例,如果换成普通的time.sleep(5),或者--threads设成1,则只能串行执行requests 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/906982.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

像`npm i`作为`npm install`的简写一样,使用`pdm i`作为`pdm install`的简写

只需安装插件pdm-plugin-i即可: pdm plugin add pdm-plugin-i 然后就可以愉快地pdm i了,例如: git clone https://github.com/waketzheng/fast-dev-cli cd fast-dev-cli python -m pip install --user pipx pipx install pdm pdm plugin a…

C#笔记——委托(2)

Unity定义好的委托 在Unity里使用委托时&#xff0c;除了上章讲的自定我委托&#xff0c;还可以使用Unity定义好的委托 Action 无参无返回值委托 Func<T> 泛型委托 返回指定类型 Action<T1, T2> 可以传多个参数的有参委托 无返回值 Func<T1, T2> 可…

【玉米叶部病害识别】Python+深度学习+人工智能+图像识别+CNN卷积神经网络算法+TensorFlow

一、介绍 玉米病害识别系统&#xff0c;本系统使用Python作为主要开发语言&#xff0c;通过收集了8种常见的玉米叶部病害图片数据集&#xff08;‘矮花叶病’, ‘健康’, ‘灰斑病一般’, ‘灰斑病严重’, ‘锈病一般’, ‘锈病严重’, ‘叶斑病一般’, ‘叶斑病严重’&#x…

供应商图纸外发:如何做到既安全又高效?

供应商跟合作伙伴、客户之间会涉及到图纸外发的场景&#xff0c;这是一个涉及数据安全、效率及合规性的重要环节。供应商图纸发送流程一般如下&#xff1a; 1.申请与审批 采购人员根据需要提出发放图纸的申请并提交审批&#xff1b; 采购部负责人审批发放申请&#xff0c;确…

【深度学习】时间序列预测、分类、异常检测、概率预测项目实战案例

说明&#xff1a;本专栏内容来自于个人学习笔记、以及相关项目的实践与总结。写作目的是为了让读者体会深度学习的独特魅力与无限潜力&#xff0c;以及在各行各业之中的应用与实践。因作者时间精力有限&#xff0c;难免有疏漏之处&#xff0c;期待与读者共同进步。 前言 在当今…

JZ2440开发板——LCD

以下内容源于韦东山嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 之前在博文中学习过LCD&#xff08;SoC是S5PV210&#xff09;&#xff0c;作为对比&#xff0c;本文学习S3C2440这款SoC的LCD方面的内容。主要涉及以下三个内容&#xff1a; 一、LCD的硬件原理 1.…

2024 Rust现代实用教程:Ownership与结构体、枚举

文章目录 一、Rust的内存管理模型1.GC&#xff08;Stop the world&#xff09;2.C/C内存错误大全3.Rust的内存管理模型 二、String与&str1.String与&str如何选择2.Example 三、枚举与匹配模式1.常见的枚举类型&#xff1a;Option和Result2.匹配模式 四、结构体、方法、…

数据结构C语言描述1(图文结合)--顺序表讲解,实现,表达式求值应用,考研可看

前言 这个专栏将会用纯C实现常用的数据结构和简单的算法&#xff1b;用C基础即可跟着学习&#xff0c;代码均可运行&#xff1b;准备考研的也可跟着写&#xff0c;个人感觉&#xff0c;如果时间充裕&#xff0c;手写一遍比看书、刷题管用很多&#xff0c;这也是本人采用纯C语言…

Oracle视频基础1.3.7练习

1.3.7 看oracle是否启动构造一个pfile:boobooke.ora看spfilewilson内容修改alert log file里拷贝的参数内容&#xff0c;创建一个pfile boobooke.ora用新创建的pfile启动数据库&#xff0c;并创建新的spfile:spfilebbk.ora启动数据库&#xff0c;监听&#xff0c;看新的进程解…

数据转换 | Matlab基于SP符号递归图(Symbolic recurrence plots)一维数据转二维图像方法

目录 基本介绍程序设计参考资料获取方式 基本介绍 Matlab基于SP符号递归图&#xff08;Symbolic recurrence plots&#xff09;一维数据转二维图像方法 符号递归图(Symbolic recurrence plots)是一种一维时间序列转图像的技术&#xff0c;可用于平稳和非平稳数据集;对噪声具有…

将android studio3.4.1改为as 2024的方法

将android studio3.4.1改为as 2024的方法 先正常的open项目&#xff0c;不用等gradle build完&#xff0c;就先改这2个地方&#xff1a; 1.替换as2024新建一个空的正常的项目的build.gradle和config.gradle 2.在build.gradle(app)中 删除3处kotlin相关的提示&#xff08;2个…

【温酒笔记】DMA

参考文档&#xff1a;野火STM32F103 网友资料整理 1. Direct Memory Access-直接内存访问 DMA控制器独立于内核 是一个单独的外设 DMA1有7个通道DMA2有5个通道DMA有四个等级&#xff0c;非常高&#xff0c;高&#xff0c;中&#xff0c;低四个优先级如果优先等级相同&#xf…

Stable Diffusion Web UI 1.9.4常用插件扩展-WD14-tagger

Stable Diffusion Web UI 1.9.4 运行在 WSL 中的 Docker 容器中 tagger 插件的作用是&#xff0c;上传一张图片&#xff0c;反推这张图片可能的提示词。 使用场景就是&#xff0c;想要得到类似的图片内容时使用。 WD14-tagger 安装 Stable Diffusion WebUI WD14-tagger GitH…

VS 中使用c#高版本语言方法

方法如下&#xff0c;打开项目工程文件&#xff08;记事本&#xff09;&#xff0c;然后添加如下语句&#xff1a;保存&#xff0c;重新加载即可使用最新C#语法。

Golang--DOS命令、变量、基本数据类型、标识符

1、DOS命令 切换盘符&#xff08;大小写没有区别&#xff09;&#xff1a; c: //切换到c盘 d: //切换到d盘 e: //切换到e盘 显示文件内信息&#xff1a; 指令&#xff1a;dir 切换路径&#xff1a; 指令&#xff1a;cd 绝对路径 / 相对路径 . 表示当前…

正反向滤波的简述和MATLAB代码

文章目录 MATLAB 例程:卡尔曼滤波与反向滤波运行结果代码说明总结P.S. 相关公式1. 正向滤波(Forward Filtering)2. 反向滤波(Backward Filtering)3. 总结以下是一个简单的MATLAB例程,演示如何使用卡尔曼滤波进行状态估计,包括正向滤波和反向滤波的实现。这个例程模拟了一…

Django目录结构最佳实践

Django项目目录结构 项目目录结构配置文件引用修改创建自定义子应用方法修改自定义注册目录从apps目录开始 项目目录结构 └── backend # 后端项目目录&#xff08;项目名称&#xff09;├── __init__.py├── logs # 项目日志目录├── manage.py #…

KVM 使用主机 GPU

KVM 如何使用主机的 GPU&#xff0c;首先安装 KVM。 配置Grub vi /etc//etc/default/grub GRUB_CMDLINE_LINUX"amd_iommuon iommupt videoefifb:off vfio_pci.ids10de:1e07,10de:10f7,10de:1ad6,10de:1ad7"查看主机显卡信息 lspci -nnk | grep -A 3 VGA 找到GP…

b站小土堆PyTorch视频学习笔记(二)

Dataloader:提供不同类型的数据集&#xff1b;为后面的网络提供不同的数据形式 Dataset&#xff1a;提供一种方式去获取数据及其label&#xff08;标签&#xff09; 主要实现以下两个功能&#xff1a; {如何获取每一个数据及其lable&#xff1b;告诉我们总共有多少数据} fr…

nginx的proxy_next_upstream使用中的一个坑

今天线上系统出了点问题&#xff0c;机房的电信出口突然不通了&#xff0c;原本以为能自动切换的nginx配置&#xff0c;居然没有生效&#xff0c;导致了业务告警&#xff0c;手工紧急处理了才解决了。 当时的设想是&#xff0c;如果这个服务的访问&#xff0c;出现了500或者超…