fastapi 如何控制并发——其二

python FastAPI 如何解决并发和性能问题 FastAPI 是一个基于 Python 3.6+ 的 Web 框架,它具有简单易用、高性能、快速编写 API 等特点。 阅读详情
AI摘要

本文介绍了一种使用uvicorn启动FastAPI服务的轻量化方案,并通过线程锁实现了并发控制,适用于快速搭建模型服务进行业务验证。

业务背景

书接上文 gunicorn+fastapi 如何控制并发——其一 ,后续我又接到了模型服务化的需求,简单搭个demo服务支持业务验证和对比实验,后续我觉得使用 Nginx+gunicorn+FastAPI 这种办法实在太重了,有没有更简单的办法,可以暂时支撑一段时间?

其实我们这里使用一个全局变量加线程锁就可以解决这个问题,之前使用 gunicorn 是因为想是用框架的一些能力,只可惜实现并发限流及其困难。那么有没有什么比较简单的框架呢?后续调研到可以使用 uvicorn ,这是一种 ASGI 服务器框架,主要用于处理异步请求。因为``FastAPI使用的是ASGI标准,而之前使用的gunicorn` 是用于处理同步请求的,使用的是 WSGI 标准,例如 Flask,Django等,两种协议之间差异参考这里。

我们甚至可以直接在python代码中启动服务,直接使用 python app.py 就可以启动HTTP服务:

import uvicorn
from fastapi import FastAPI

app = FastAPI()


@app.get("/hello")
def predict():
    return "world"


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

那如何实现控制并发呢,因为 uvicorn 是基于 ASGI 协议的服务框架,因此在接收请求时,不必等待worker 空闲,默认worker能够异步处理多个请求。因此如果我们只是支持:每个worker支持1个并发,那么可以通过线程锁的方式来判断当前work是否繁忙,例如:

import uvicorn
from threading import Lock
from fastapi import FastAPI, HTTPException

app = FastAPI()

lock = Lock()
import time


@app.get("/hello")
def predict():
    acquired = lock.acquire(blocking=False)
    if acquired:
        try:
            time.sleep(1)
        finally:
            lock.release()
        return "world"
    else:
         raise HTTPException(
            status_code=503,
            detail="service busy",
        )


if __name__ == "__main__":
    uvicorn.run(
        app="main:app",
        host="0.0.0.0",
        port=8000,
        log_level="debug",
        workers=10,
    )

我们通过非阻塞的方式获取线程锁,然后判断是否能够拿到锁,如果不能则立刻返回503错误。而且如果模型可以支持异步流式,我们甚至可以控制worker的并发度。相比之前 Nginx+gunicorn+FastAPI 的方案,这种方法简直不要简单太多。

fastapi 如何控制并发——其三 随后我们改用多进程的方式去测试,在客户端并发数为4,服务端进程数为8的情况下,平均耗时也有347ms,并且成功率只有22%,这里的347s存在水分,很多失败的请求只有1~2ms,存在摊还的情况。那可能真的是在并发数上来的情况下确实是耗时增大了,我们猜测是并发多了后,CPU成为了瓶颈,我们在使用多进程方案时,观察CPU利用率,发现确实已经占满了。上面我们使用的是多线程编程,正如我们之前所说的,对于计算密集型服务,python的多进程就是个笑话,这是由于。因此我们有必要测试在多核机器上,多线程方案的表现。 阅读详情

相关推荐

Python 解析 FastAPI 在高并发应用中的优化

FastAPI 提供了强大的工具和灵活的设计理念,使得构建高并发应用变得更加简单高效。通过合理运用异步编程、连接池管理和缓存机制,可以显著提升系统的吞吐量和响应速度。希望本文提供的优化策略能帮助你在实际项目中更好地发挥 FastAPI 的潜力。```

2501_91142733的博客 791

fastapi 如何控制并发——其一

先说结论,单独靠这里的业务场景是:单机只启动一个进程,也就是,同时只能只处理一个请求,其他的请求全部拒绝,而不进行排队。我们使用了fastapi。

骑者,且赶路 4252

从零搭建ROS1导航小车(一):松灵SCOUT Mini底盘通讯配置与ROS包编译避坑指南

本文详细介绍了从零开始搭建ROS1导航小车的初始步骤,重点讲解松灵SCOUT Mini底盘的通讯配置与ROS包编译避坑指南。内容包括硬件连接、CAN通讯配置、ROS工作空间构建及编译优化等实用技巧,帮助开发者快速实现自主导航小车的通讯功能。

weixin_27014595的博客 189

Python/FastAPI 的并发能力对比

最后,还是觉得有几点放到总结里头的,方便回顾时直接跳到最后方使用 FastAPI 直接用 Uvicorn 启动就行,代码或 uvicorn 方式都行。而不像代码启动 Flask 真的只能用于开发过程,产品环境必须用 uwsgi 或 gunicornFastAPI 的 async API 方法都由 MainThread 调用,因此其中调用的外部耗时方法必须也都是 async,并以 await 方式调用,否则一个请求拦住所有的其他请求。

stephen147的博客 3551

基于Qt与PaddleOCR的跨平台OCR工具开发实战

本文详细介绍了基于Qt与PaddleOCR开发跨平台OCR工具的实战经验。通过Qt的跨平台特性和PaddleOCR的高效识别能力,开发者可以快速构建支持Windows、Linux和macOS的OCR工具。文章涵盖了环境配置、核心功能实现、性能优化及打包发布等关键环节,特别针对中文识别、内存管理和多线程处理等常见问题提供了解决方案。

weixin_30296405的博客 90

Altium AD20差分对走线设置方法

AD20的PCB差分对走线设置 1、原理图添加差分对 先在原理图中,讲要设置差分对的网络对添加网络标签。 名称前面的内容要相同,后缀用 _P 和 _N 加以区分。 最后使用 放置差分对,将两个网络标记。 2、编译,更改到PCB 编译,更新到PCB,确认差分对网络的出现。 验证更改,执行更改。将改动更新到PCB中。 PCB中,可通过 右下角 Panels - 调出 PCB 显示。来对已添加的差分对进行查看。 这时原本的走线有一点点小问题,需要删掉原来走线,设置差分对规则,并重新布线。

Mark_md的博客 3万+

【FastAPI异步并发控制终极指南】:掌握高并发场景下的请求管理秘籍

掌握高并发场景下FastAPI异步请求与并发控制的完整解决方案,提升接口响应速度与系统稳定性。详解限流、信号量及异步任务管理等核心方法,适用于高负载Web服务。实战技巧一应俱全,值得收藏。

CodePulse的博客 736

RK3588开发板实战:从零开始移植Ubuntu 24.04(讯为SDK版)

本文详细介绍了如何在RK3588开发板上从零开始移植Ubuntu 24.04系统(讯为SDK版),涵盖开发环境准备、SDK解析、根文件系统定制、驱动适配、系统集成与烧录等全流程。通过实战案例,帮助开发者快速掌握RK3588开发板的系统移植技巧,适用于嵌入式开发与定制化Linux系统构建。

sand8的博客 437

LLM部署实战:基于Qwen2+FastAPI的并发控制与流式响应实现

本文提出了一种基于FastAPI的LLM服务器部署方案,重点解决了并发控制和流式响应两大工程问题。通过异步队列实现请求限流,当并发请求超过阈值(如10个)时直接拒绝,避免服务器过载。针对LLM推理同步阻塞问题,采用线程池执行器将同步任务转换为异步执行,实测在Qwen2模型上可实现并发推理。在流式响应方面,利用TextIteratorStreamer实现边推理边输出的能力,显著提升长文本生成时的用户体验。该方案为单机部署LLM服务提供了完整的工程实现参考,涵盖从模型加载、并发处理到响应优化的全流程。

2401_85154887的博客 1213

SoIC、CoWoS、InFO一次讲透:从2D/2.5D/3D看懂先进封装

先进封装是后摩尔时代提升芯片性能的关键路径,但面对SoIC、CoWoS、InFO这些名词,很多人容易混淆。理解它们,需从最基本的2D、2.5D、3D封装概念入手:2D是传统平房,2.5D通过硅中介层实现高密度互连,3D则让芯片直接堆叠。CoWoS作为2.5D中介层封装,已成为AI芯片与HBM高带宽存储集成的行业标准;SoIC通过铜-铜混合键合实现真正的3D堆叠,为逻辑与缓存提供极致带宽;InFO以扇出型封装兼顾成本与集成度,广泛用于移动SoC。在系统级封装(SiP)和CPO共封装光学等前沿趋势中,这些技术往

weixin_42388898的博客 313

从jieba分词到BERT-wwm——中文自然语言处理(NLP)基础分享系列(12)

今天是本系列的最后一期,完整代码呈现Huggingface transformers平台上微调BERT-wwm-ext的过程方法。

weixin_49518391的博客 3765

【高并发系统设计必修课】:FastAPI中实现精准并发控制的5种方案

掌握高并发场景下的FastAPI异步请求并发控制技巧,本文详解5种精准限流与协程管理方案,适用于API网关、微服务等场景,提升系统稳定性与响应效率,方法实用且易于集成,值得收藏。

LearnFlow的博客 779

QT+QGIS跨平台编译(基于Qt,采用一套代码、一套框架,完成QGIS第三方库、核心库、应用程序的跨平台编译)

QT+QGIS跨平台编译。 基于Qt,采用一套代码、一套框架,完成QGIS第三方库、核心库、应用程序的跨平台编译。

LuckyHanMo的博客 4379

FastAPI异步编程实战(并发控制全解析)

掌握FastAPI异步请求与并发控制技巧,提升高并发场景下的接口性能。详解限流、信号量及后台任务处理策略,适用于API网关、微服务等场景,保障系统稳定性。方法实用,值得收藏。

ProceNest的博客 749

GB28181 —— 3、C++编写GB28181设备端,完成注册、注销、保活心跳、响应查询目录等功能(附源码)

GB28181 —— Win10下编写GB28181设备端,完成注册、注销、保活心跳、响应查询目录等功能(附源码)

1309

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

从入门到精通:FastAPI异步请求与并发控制完整实践路径

掌握高性能Web开发关键,本文深入解析FastAPI异步请求与并发控制实践方法,涵盖接口优化、协程应用及限流策略,适用于高并发API服务场景。提升系统响应效率,构建可扩展后端服务,值得收藏。

QuickSolve的博客 932

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

FastAPI限流与并发控制,这一篇就够了:构建健壮Web服务的核心策略

掌握FastAPI异步请求并发控制,提升服务稳定性与性能。本文详解限流策略、依赖注入控制并发数、结合Redis实现分布式限流,适用于高并发API场景,有效防止资源过载。方法实用,效果显著,值得收藏。

ProceGlow的博客 1111

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

LLM部署,并发控制,流式响应(Python,Qwen2+FastAPI)

本文实现了工程实践下并发控制下LLM服务器部署并提供流式响应。使得LLM服务器可以同时处理多个请求,并实现“当请求达到一定数量后,直接拒绝后续的推理请求”功能,防止服务器过载以及排队时间过长影响用户体验(直接告知服务器繁忙)。此外,对于较为复杂的问题(推理复杂、文本过长)生成回答,在并发架构下实现了“边推理便输出内容”的“流式响应”,可有效提高用户体验,优化人机交互实现。使用Python+Qwen2+FastAPI

悠逸的博客 1万+

揭秘FastAPI异步请求瓶颈:如何通过并发控制提升系统吞吐量500%

掌握FastAPI异步请求性能瓶颈的破解之道,通过并发控制优化系统吞吐量。适用于高并发Web服务场景,结合限流与协程调度提升响应效率,实现500%性能跃升。实用技巧值得收藏。

CompiLume的博客 874

FastAPI并发控制实战:多线程与多进程的性能博弈

本文通过一次压测失败的案例,深入探讨了FastAPI在多进程模式下并发控制的陷阱。文章揭示了Uvicorn多进程间状态隔离的问题,并提出了在单个Worker内使用线程池实现精确并发控制的解决方案。同时,分析了GIL对计算密集型任务的实际影响,并提供了根据模型类型(I/O密集型、计算密集型)选择并发策略的实战部署指南。

weixin_29044157的博客 427

高级 Python Web 开发:基于 FastAPI 构建高效实时聊天系统与并发控制

WebSocket 是一种网络协议,旨在提供在客户端与服务器之间持久化、全双工的通信通道。与传统的 HTTP 请求-响应模型不同,WebSocket 允许客户端和服务器之间建立一个持续的连接,这使得它非常适合用于构建实时应用,如聊天系统、在线游戏和实时数据流等。在传统的 HTTP 通信中,每次请求都需要重新建立连接,而 WebSocket 通过单一的握手过程就可以保持连接的持久性。这种技术可以显著减少延迟,使得数据交换更为迅速与高效。

switch616的博客 1711

FastAPI GPU推理并发控制实战:避免请求一多就显存溢出

针对GPU服务并发导致的显存溢出问题,文章提出基于FastAPI、Semaphore和单进程模型的并发控制方案。核心措施包括:模型仅加载一次、用Semaphore限制并发、规范输入输出长度、单Worker启动、添加健康检查及阶梯压测。强调从并发1开始测试,避免多Worker重复加载模型,并通过健康检查与压测数据确定容量。

2601_95688163的博客 274

为什么你的FastAPI接口在高并发下崩溃?(并发控制缺失的代价)

掌握FastAPI异步请求的并发控制技巧,有效避免高并发下接口崩溃。适用于高负载Web服务场景,通过限流与信号量精准管理并发任务,提升系统稳定性与响应速度。实用方案值得收藏。

SimSolve的博客 986

AI原生应用后端实战:FastAPI异步、流式输出与并发控制全解

在AI驱动的软件架构中,后端不仅要处理传统的高并发请求,还要面对大模型接口的流式响应、多轮对话状态管理以及向量数据库读写等复杂场景。异步编程成为构建高吞吐服务的基石,通过非阻塞IO可以显著提升系统在长连接任务下的并发能力。而请求与响应的结构化校验则依赖类型安全的Schema设计,确保数据传输的严谨性与健壮性。流式传输技术如SSE,让模型生成的token能实时推送至前端,极大改善用户体验。在工程实践中,合理管理数据库连接池、控制并发信号量以及处理热更新问题,都是保障服务稳定性的关键环节。本文以一个完整的AI服

aoe41606的博客 490
上一篇: fastapi 如何控制并发——其一
下一篇: fastapi 如何控制并发——其三
Corleo
博客等级 码龄11年 120粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值