FlaskFastAPIgunicornunicorn并发调用

news2024/12/25 9:30:46

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 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

安装scrcpy-client模块av模块异常,环境问题解决方案

背景 使用 pip install scrcpy-client命令出现以下报错 performance hint: av\logging.pyx:232:5: Exception check on log_callback will always require the GIL to be acquired. Possible solutions: 1. Declare log_callback as noexcept if you control the definition …

Linux——常见指令及其权限理解(正在更新中)

1.指令 1.1 快速了解指令 pwd 首次登录,默认所处的路径 whoami 当前所用的用户的名称 ls 显示当前路径下,文件名称 mkdir 在当前目录下,创建一个文件夹/目录 cd 进入一个目录 touch 新建一个文…

胡壮麟《语言学教程》第五版PDF英文版+中文版翻译

胡壮麟《语言学教程》中文版:https://pan.quark.cn/s/9491130ec572 《语言学教程》(英文版)是一部经典的语言学教材,自 1988 年面世以来,被众多高校广泛采用,长销不衰。该教材自出版以来不断修订&#xff…

项目模块十二:TcpServer模块

一、模块设计思路 1、目的 对所有模块整合,实现一个服务器模块供外部快速搭建服务器。 2、管理 监听套接字 主 Reactor,创建 EventLoop _baseloop 对象,进行对监听套接字的管理 哈希表管理所有新连接的 Channel 创建线程池进行连接的事…

【Spring源码核心篇-01】精通Spring的bean的生命周期

Spring源码核心篇整体栏目 内容链接地址【一】Spring的bean的生命周期https://zhenghuisheng.blog.csdn.net/article/details/143441012 spring的bean的生命周期 一,spring中bean的生命周期1,生成BeanDefinition1.1,初始化context和BeanFacto…

IAR出现,Error [e12].Unable to open file "xxxx:_app.xcl"怎么办?

编译时出现,一般是拷贝过来出现这个问题。解决方法: 1,点击到最左边“code -Debug”上 2,点Project>>>options for node "code" 3,选项卡“linker”>>"linker configuration fil…

C#与C++交互开发系列(十一):委托和函数指针传递

前言 在C#与C的互操作中,委托(delegate)和函数指针的传递是一个复杂但非常强大的功能。这可以实现从C回调C#方法,或者在C#中调用C函数指针的能力。无论是跨语言调用回调函数,还是在多线程、异步任务中使用委托&#x…

SpringBoot国际化:创建多语言支持的Web应用

SpringBoot国际化:创建多语言支持的Web应用 介绍 SpringBoot作为一个强大的框架,提供了便捷的国际化支持,使开发者能够轻松创建多语言支持的Web应用。通过使用SpringBoot的MessageSource,开发者可以在应用中实现动态的语言切换。…

如何快速搭建一个3D虚拟展厅?

随着元宇宙概念的兴起,一个全新的虚拟、立体数字空间正逐步成为我们生活的一部分。在这个空间里,用户可以沉浸其中,进行丰富的交互操作,体验前所未有的无限可能。而如何快速搭建一个属于自己的元宇宙3D虚拟展厅,正成为…

blender 小车建模 建模 学习笔记

一、学习blender视频教程链接 案例4:狂奔的小车_建模_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1Bt4y1E7qn?p14&spm_id_from333.788.videopod.episodes&vd_sourced0ea58f1127eed138a4ba5421c577eb1 二、开始建模 (1)创…

强大的文本编辑器Notepad++8.4.6 最新版

Notepad最新版是一款多功能的代码编辑工具。Notepad官方版支持27种编程语言,涵盖C、C 、Java 、C#,、XML、 HTML,、PHP、python等等,能够帮助程序员提高编辑效率。Notepad软件支持python与sql代码高亮功能,并且免费开源,能够完美地…

彻底理解链表(LinkedList)结构

目录 比较操作结构封装单向链表实现面试题 循环链表实现 双向链表实现 链表(Linked List)是一种线性数据结构,由一组节点(Node)组成,每个节点包含两个部分:数据域(存储数据&#xff…

小小猫棒onu替换家用光猫,薅运营商带宽羊毛,突破1000M

小小猫棒onu 一、总体步骤 1 记录原来光猫信息 主要包括SN,ploam密码,loid、loid密码、 mac、上网的vlan id等 一般gpon采用SN、ploam密码、SNploam密码三种中的一种认证方式 一般Epon采用loid(逻辑id)、mac、loid mac三种中…

【经典论文阅读11】ESMM模型——基于贝叶斯公式的CVR预估

传统的CVR模型(也就是直接对conversion rate建模的模型)在实际应用中面临两个问题(样本选择偏差与数据稀疏性问题)。为了解决这两个问题,本文提出ESMM模型。该模型巧妙地利用用户行为序列去建模这个问题,从…

二十八、Python基础语法(面向对象-下)

一、self 从函数的语法上来看, self 是形参 , 是一个普通的参数,那么在调用的时候,就需要传递实参值。从调用上看, 我们没有给 self 这个形参传递实参值, 但是 Python 解释器会自动的将调用这个方法的对象,作为实参值传递给 self。 class Dog:def eat(self):print…

江协科技STM32学习- P27 实验-串口发送/串口接收

🚀write in front🚀 🔎大家好,我是黄桃罐头,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流 🎁欢迎各位→点赞👍 收藏⭐️ 留言📝​…

基于大语言模型(LLM)自主Agent 智能体综述

近年来,LLM(Large Language Model)取得了显著成功,并显示出了达到人类智能的巨大潜力。基于这种能力,使用LLM作为中央控制器来构建自助Agent,以获得类人决策能力。 Autonomous agents 又被称为智能体、Agent。指能够通过感知周围环境、进行规划以及执行动作来完成既定任务。…

自由学习记录(15)

Java注解 else if的省略问题(可能看花) else if也是取最近的if连通,看上去加了{}就可以正常执行了,缩进要命,不提示真容易看错, 组合数公式和数组参数 在 C 中,数组作为函数参数时,…

直流稳压电源设计

一、设计任务和基本要求: (1)设计集成直流稳压电源电路。 (2)输出直流电压5V。 (3)画出逻辑电路图,对电路进行仿真验证,写出总结报告。 图 1 系统组成框图 二、进度安排…

使用LangChain控制大模型的输出——解析器Parser

LangChain框架中有两个好用的工具: 提示词模板(PromptTemplate)用于指定LLM的输入,解析器(Parser)来正确解释LLM给出的输出 即: 提示词模板(PromptTemplate):用于格式化地接受输入string变量,作为完整的提示词。 如 给…