Python/FastAPI 的并发能力对比

本文进行实际测试 FastAPI 的并发能力,即同时能处理多少个请求,另外还能接收多少请求放在等待队列当中; 并找到如何改变默认并发数; 以及它是如何运用线程或进程来处理请求。我们可以此与 Flask 进行对比,参考 Python Flask 框架的并发能力及线,进程模型,是否真如传说中所说的 FastAPI 性能比 Flask 强, FastAPI 是否对得起它那道闪电的 Logo。

本文使用 JMeter 进行测试,测试机器为 MacBook Pro, CPU 6 核超线程,内存 16 Gb。

对于每一种类型 Web 服务基本的测试是每秒发送 2 个请求,连续发送 1000 个,500 秒发送完所有请求,程序中 API 方法接受到请求后 sleep 800 秒,保证在全部 1000 个请求送出之前一直占着连接,并有充足的时间对连接进行分析。在测试极端并发数时,由于在 Mac OS X 尽管设置了 ulimit 最多也只能创建 4000 多一点线程,所以在模拟更多用户数时,JMeter 在远程 Linux(Docker 或虚拟机) 上运行测试用例。

请求的 URL 是 http://localhost:8080/?id=${count}, 带一个自增序列用以识别不同的请求, JMeter 的 Thread Group 配置为 Number of Threads (users): 1000, Ramp-up period (seconds): 500

首先安装依赖

pip install fastapi
pip install uvicorn[standard]

当前安装的最新版本 fastapi0.94.1, uvicorn0.21.1

测试同步方法

app.py

from fastapi import FastAPI, Query
import threading
import time
from datetime import datetime
import os
import uvicorn
 
app = FastAPI()
global_request_counter = 0
 
 
@app.get("/")
def index(request_id: str = Query(..., alias="id")):
    global global_request_counter
    global_request_counter += 1
    thread_name = threading.current_thread().name
    print(f"{
     datetime.now()} - {
     os.getpid()}-{
     thread_name}: #{
     global_request_counter} processing request id[{
     request_id}], sleeping...")
    time.sleep(800)
    print(f"{
     datetime.now()} - {
     os.getpid()}-{
     thread_name}: done request id[{
     request_id}]")
    return "hello"
 
# 或者用命令方式启动 uvicorn app:app --host 0.0.0.0 --port 8080
if __name__ == '__main__':
    uvicorn.run
### Flask 和 FastAPI对比 #### 功能实现 Flask 是一个轻量级的 Web 应用程序框架,提供了灵活的基础结构以便开发者可以自由扩展其功能[^1]。相比之下,FastAPI 利用了现代 Python 特性(如类型提示),从而简化了开发过程并增强了代码的安全性和可读性[^2]。 #### 文档生成功能 在 API 开发方面,任何框架都需要提供清晰的文档支持。Flask 需要额外集成第三方库(例如 Swagger 或 ReDoc)才能生成交互式的 API 文档。而 FastAPI 自带 OpenAPI 支持以及自动生成的交互式文档界面(Swagger UI/ReDoc),这使得开发者能够更加专注于业务逻辑而非配置工作。 #### 数据库集成与性能优化 当涉及到数据库操作时,Flask 可以通过插件轻松连接多种数据库系统,比如 MongoDB 和 Redis。以下是一个基于 Flask 使用 MongoDB 的示例: ```python from flask import Flask from flask_mongoengine import MongoEngine app = Flask(__name__) app.config['MONGODB_SETTINGS'] = {'DB': 'my_catalog'} db = MongoEngine(app) class Product(db.Document): name = db.StringField(required=True, max_length=200) price = db.FloatField(required=True) ``` 上述代码展示了如何利用 `flask-mongoengine` 插件快速搭建起一个简单的数据模型[^3]。然而,在处理大规模并发请求或者复杂的数据验证场景下,FastAPI 凭借其内置的支持异步编程的能力往往表现得更为出色。 #### 性能差异 由于采用了 Starlette 作为底层服务器技术栈,并充分利用了 async-await 关键字带来的优势,因此 FastAPI 能够显著提高应用程序吞吐率和响应速度。与此同时,它还兼容 gunicorn 等 WSGI 容器部署方式,方便生产环境下的运维管理。 --- ### 结论 综上所述,如果项目需求偏向于灵活性高且定制化程度较大的传统 Web 应用,则可以选择 Flask;而对于现代化微服务架构设计中的高性能 RESTful API 构建任务来说,FastAPI 显然是更好的选项之一。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值