首页 > 编程问答 >FastAPI 以串行方式而不是并行方式运行 api 调用

FastAPI 以串行方式而不是并行方式运行 api 调用

时间:2024-07-24 15:18:24浏览次数:12  
标签:python asynchronous python-asyncio fastapi concurrent-processing

我有以下代码:

import time
from fastapi import FastAPI, Request
    
app = FastAPI()
    
@app.get("/ping")
async def ping(request: Request):
        print("Hello")
        time.sleep(5)
        print("bye")
        return {"ping": "pong!"}

如果我在本地主机上运行我的代码 - 例如, http://localhost:8501/ping - 在同一浏览器窗口的不同选项卡中,我得到:

Hello
bye
Hello
bye

而不是:

Hello
Hello
bye
bye

我已阅读有关使用|的内容||,但我仍然无法实现真正​​的并行化。有什么问题? httpx , but still, I cannot have a true parallelization. What's the problem?


问题在于,尽管你使用了 async await ,但 time.sleep(5) 仍然是一个阻塞操作。在 FastAPI 中, async 仅仅意味着函数可以被挂起,以便在等待 I/O 操作(例如网络请求)完成时,其他请求可以被处理。然而, time.sleep(5) 会阻塞事件循环,阻止其他请求被处理,直到睡眠时间结束。

为了实现真正的并行化,你需要使用非阻塞操作来模拟长时间的任务。以下是一些选项:

1. 使用 asyncio.sleep() :

asyncio.sleep() time.sleep() 的异步版本,它不会阻塞事件循环。

import asyncio
from fastapi import FastAPI, Request

app = FastAPI()

@app.get("/ping")
async def ping(request: Request):
    print("Hello")
    await asyncio.sleep(5)  # 使用 asyncio.sleep()
    print("bye")
    return {"ping": "pong!"}

2. 使用后台任务:

如果你需要执行 CPU 密集型任务,可以将它们卸载到后台任务中,以避免阻塞主线程。FastAPI 提供了 BackgroundTasks 类来实现这一点。

from fastapi import FastAPI, Request, BackgroundTasks
import time

app = FastAPI()

def background_task():
    print("Hello")
    time.sleep(5)
    print("bye")

@app.get("/ping")
async def ping(request: Request, background_tasks: BackgroundTasks):
    background_tasks.add_task(background_task)  # 在后台运行任务
    return {"ping": "pong!"}

3. 使用线程或进程池:

对于 CPU 密集型任务,你还可以使用线程池或进程池来实现并行化。Python 的 concurrent.futures 模块提供了一些工具来管理线程和进程池。

from fastapi import FastAPI, Request
from concurrent.futures import ThreadPoolExecutor

executor = ThreadPoolExecutor(max_workers=2)  # 创建一个线程池

app = FastAPI()

def blocking_task():
    print("Hello")
    time.sleep(5)
    print("bye")

@app.get("/ping")
async def ping(request: Request):
    loop = asyncio.get_event_loop()
    await loop.run_in_executor(executor, blocking_task)  # 在线程池中运行任务
    return {"ping": "pong!"}

请记住,选择哪种方法取决于你的具体需求和任务类型。如果你的任务是 I/O 密集型的,那么使用 asyncio.sleep() 就足够了。如果你的任务是 CPU 密集型的,那么你可能需要使用后台任务、线程池或进程池。

标签:python,asynchronous,python-asyncio,fastapi,concurrent-processing
From: 71516140

相关文章

  • python带界面实现word文档比对功能
    python实现word文档比对的功能较简单,笔者这里将其界面话,可以指定输入比对的文档,相似度,最小相似参数等。输出的结果以word的形式保存,重复部分会标出,基本实现了商业软件的功能。先看界面这里不废话了,直接给出全部源码,觉得好的点个赞。程序打包的话,自己百度。fromtkinterimp......
  • 具有固定字典键的 Python 函数返回类型提示
    我有一个函数返回一个始终具有相同键的字典(通过网络发送并使用json进行“字符串化”)。基本上我的函数看起来像这样:defgetTemps(self)->dict:"""getroomandcputemperaturein°Caswellashumidityin%"""#sendtemperaturerequesttoserve......
  • 在类型提示中使用 Type[class_name] 而不是仅使用 class_name 时,python 未解析的属性
    我想输入提示继承结构,但我不知道如何正确执行。这个想法是函数c可以采用A的任何子类。一些子类具有其他子类没有的属性,并且这些属性不是在父类中定义,而是在子类中定义。函数c检查子类,如果它是正确的,则使用该类的特定属性。在此设置中,PyCharm抱怨该参数不在父类中。from......
  • python的包管理
    获取现有项目有那些依赖安装pipreqspipinstallpipreqs在项目根目录执行pipreqs.--encoding=utf8--force--pypi-server=http://mirrors.aliyun.com/pypi/simple/根据生成文件安装依赖pipinstall-rrequriements.txtpipreqs命令选项Options:--use-local......
  • 如何在 python selenium 中禁用广告隐私设置?
    我对上面有一些问题。当然,当我尝试绕过cloudflare验证码时,我的策略已经破坏了任何cloudflare。但有一些问题。当我在pythonselenium中打开新选项卡时,会弹出广告隐私窗口。谁有解决这个问题的经验。谢谢您的帮助。一旦通过,就不会再发生了。我理解你想在......
  • [附开题]flask框架的基于微信小程序的医院远程预约挂号系统设计与实现6ky98(python+源
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着医疗需求的日益增长和互联网技术的飞速发展,传统的医院挂号方式已难以满足患者高效、便捷的就医需求。患者往往需要长时间排队等待挂号......
  • [附开题]flask框架的基于用户行为分析的商品推荐系统APP1qut6APP(python+源码)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景在移动互联网时代,电子商务平台的竞争日益激烈,如何精准地推荐商品给用户,提升用户体验与购买转化率,成为电商企业关注的焦点。传统的推荐算法......
  • [附开题]flask框架的教务管理系统q6190(源码+论文+python)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着信息技术的飞速发展和教育改革的不断深入,教务管理工作日益复杂且重要。传统的手工管理方式已难以满足当前高校教务管理的需求,特别是在......
  • python闭包和装饰器
    一、闭包1.闭包的三要素1.外部函数嵌套内部函数2.内部函数可以调用外部函数的局部变量3.外部函数返回内部函数2.示例代码 #外部函数deffunc1():print("func1")#内部函数deffunc2():print("func2")#外部函数返回内部函数re......
  • python Subprocess 模块
    Subprocess介绍subprocess模块是Python标准库中的一个模块,用于管理子进程(子程序)。通过subprocess模块,可以在Python脚本中启动新的进程、连接到它们的输入/输出流以及获取它们的返回值。Subprocess主要功能1.执行外部命令:subprocess允许你在Python脚本中执行系统命......