当前位置: 首页 > article >正文

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 


http://www.kler.cn/a/381533.html

相关文章:

  • 11.5学习swing
  • 初识数据结构(什么是数据结构、算法,数据结构的重要性,算法的重要性)
  • 单链表的实现(数据结构)
  • 任务中心全新升级,新增分享接口文档功能,MeterSphere开源持续测试工具v3.4版本发布
  • 解决使用Golang的email库发送qq邮件报错short response,错误类型为textproto.ProtocolError
  • 筋膜枪哪个牌子好?深入探索国产筋膜枪品牌的口碑之选
  • 提高交换网络可靠性之链路聚合
  • RK3568开发板静态IP地址配置
  • oracle常用查询sql
  • EtherCAT转ModbusTCP相关技术
  • uniapp中echarts的正确集成方式:Vue2与Vue3组合式API双重视角
  • VMware虚拟机-Ubuntu设置共享文件夹
  • 若Git子模块的远端地址发生了变化本地应该怎么调整
  • OpenAI大事记;GPT到ChatGPT参数量进化
  • 第三十章 章节练习商品列表组件封装
  • 面试题分享11月5日
  • 034_Structural_Transient_In_Matlab结构动力学问题求解
  • Spring学习笔记_25——@DeclareParents
  • 【设计模式系列】建造者模式(十)
  • JAVA基础:单元测试;注解;枚举;网络编程 (学习笔记)
  • @Async注解提升Spring Boot项目中API接口并发能力
  • ElasticSearch备考 -- Manage the index lifecycle (ILM)
  • 微信小程序 高校教材征订系统
  • [C++]——哈希(附源码)
  • 智能合约中的AI应用
  • 【算法】——滑动窗口专题