开发API? FastAPI有效处理长时间运行任务的策略!

这篇具有很好参考价值的文章主要介绍了开发API? FastAPI有效处理长时间运行任务的策略!。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

快速且高效地构建API是现代软件开发的一个基础方面。然而,由于数据处理、第三方服务调用或复杂计算等原因,经常会遇到执行时间较长的API端点。面对这样的情况,确保这些长时间运行的任务不会降低用户体验或系统性能至关重要。本博客文章旨在指导您如何在FastAPI中管理长时间运行的任务。

长时间运行API端点的挑战

  1. 用户体验:响应时间过长可能会导致用户体验差。
  2. 资源利用:长时间运行的任务可能会消耗大量系统资源,从而可能影响
  3. 其他任务的性能。
  4. 错误处理:执行时间长的任务更容易出错,需要健壮的错误处理机制。

管理长时间运行任务的最佳实践

异步端点

您可以使用Python的async def语法在FastAPI中定义异步端点,这有助于I/O绑定操作。

from fastapi import FastAPI

app = FastAPI()

@app.get("/")
async def read_root():
    # 执行一个长时间运行的任务
    return {"message": "done"}

后台任务

FastAPI允许您运行可以在响应已发送后继续处理的后台任务。

from fastapi import BackgroundTasks, FastAPI

app = FastAPI()

def long_running_task():
    # 执行一个长时间运行的任务
    pass

@app.get("/")
async def read_root(background_tasks: BackgroundTasks):
    background_tasks.add_task(long_running_task)
    return {"message": "任务正在后台运行"}

使用Celery进行分布式任务队列

对于特别长时间运行的任务,您可以将它们卸载到像Celery这样的任务队列。

from fastapi import FastAPI
from celery import Celery

app = FastAPI()
celery_app = Celery('tasks', broker='pyamqp://guest@localhost//')

@celery_app.task
def long_running_task():
    # 执行一个长时间运行的任务
    pass

@app.get("/")
def read_root():
    long_running_task.apply_async()
    return {"message": "任务正在后台运行"}

通知用户的策略

一旦任务被卸载或变为异步,通知用户其完成状态是必要的。以下是实现这一目标的一些策略:

  1. 轮询
    在这种方法中,客户端最初接收一个任务ID,然后反复轮询一个端点以检查任务的状态。

服务端:

from fastapi import FastAPI
from some_task_queue import some_task_queue

app = FastAPI()

@app.post("/start_task/")
def start_task():
    task_id = some_task_queue.enqueue("long_running_task")
    return {"task_id": task_id}

@app.get("/get_result/{task_id}")
def get_result(task_id: str):
    result = some_task_queue.get_result(task_id)
    return {"result": result}

客户端:

async function startAndPollTask() {
  const response = await fetch('/start_task/');
  const task = await response.json();
  
  let result;
  do {
    const resultResponse = await fetch(`/get_result/${task.task_id}`);
    result = await resultResponse.json();
    if (result.is_done) {
      break;
    }
    await new Promise(resolve => setTimeout(resolve, 2000));
  } while(true);
  
  console.log("Final result:", result);
}
  1. Webhooks
    这里,客户端提供一个回调URL,服务器可以在任务完成后将结果POST到这个URL。

服务端:

from fastapi import FastAPI, BackgroundTasks
import requests

app = FastAPI()

def long_running_task(callback_url):
    # 执行长时间的任务
    result = "some_result"
    requests.post(callback_url, json={"result": result})

@app.post("/start_task/")
async def start_task(background_tasks: BackgroundTasks, callback_url: str):
    background_tasks.add_task(long_running_task, callback_url)
    return {"status": "任务已开始"}
    ```
3. WebSockets
您可以在客户端和服务器之间建立WebSocket连接,以在任务完成时发送结果。

服务端:

from fastapi import FastAPI, WebSocket

app = FastAPI()

@app.websocket(“/ws/”)
async def websocket_endpoint(websocket: WebSocket):
await websocket.accept()
# 长时间运行的任务
result = “some_result”
await websocket.send_json({“result”: result})

客户端:

const socket = new WebSocket(‘ws://localhost:8000/ws/’);

socket.addEventListener(‘message’, function(event) {
const result = JSON.parse(event.data);
console.log(“Received result:”, result);
});

4. 服务器推送事件(SSE)
SSE允许服务器通过单个HTTP连接发送更新和最终结果。

服务端:

from fastapi import FastAPI
from fastapi.responses import StreamingResponse

app = FastAPI()

@app.get(“/task_status/”)
def get_status():
def event_stream():
# 长时间运行的任务
result = “some_result”
yield f"data: {result}\n\n"
return StreamingResponse(event_stream(), media_type=“text/event-stream”)
```
客户端:

const eventSource = new EventSource('/task_status/');

eventSource.onmessage = function(event) {
    const result = event.data;
    console.log("Received result:", result);
};

结论

长时间运行的任务在API设计中可能会带来挑战,但FastAPI提供了各种功能和技巧来有效地处理它们。无论是异步编程、后台任务,还是像Celery、Webhooks和WebSockets这样的高级策略,您都可以根据API的需求选择合适的方法。遵循这些最佳实践和策略,您可以确保长时间运行的任务得到有效管理,而不会损害用户体验或系统性能。

阅读

英文版

AI好书推荐

AI日新月异,但是万丈高楼拔地起,离不开良好的基础。您是否有兴趣了解人工智能的原理和实践? 不要再观望! 我们关于 AI 原则和实践的书是任何想要深入了解 AI 世界的人的完美资源。 由该领域的领先专家撰写,这本综合指南涵盖了从机器学习的基础知识到构建智能系统的高级技术的所有内容。 无论您是初学者还是经验丰富的 AI 从业者,本书都能满足您的需求。 那为什么还要等呢?

人工智能原理与实践 全面涵盖人工智能和数据科学各个重要体系经典

北大出版社,人工智能原理与实践 人工智能和数据科学从入门到精通 详解机器学习深度学习算法原理 文章来源地址https://www.toymoban.com/news/detail-686405.html

到了这里,关于开发API? FastAPI有效处理长时间运行任务的策略!的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 反爬虫策略:使用FastAPI限制接口访问速率

    目录 引言 一、网络爬虫的威胁 二、FastAPI 简介 三、反爬虫策略 四、具体实现 五、其他反爬虫策略 六、总结 在当今的数字时代,数据已经成为了一种宝贵的资源。无论是商业决策、科学研究还是日常生活,我们都需要从大量的数据中获取有价值的信息。为了获取这些数据,

    2024年01月21日
    浏览(41)
  • Unity Android 长时间运行导致卡死的BUG

            最近项目中遇到一个问题,Unity 项目打包成 Android 长时间运行会导致 App 卡死。该问题出现在Unity 2021.3.19其他版本不详,由于项目中引入了arr库所以查找问题比较难受。 好在搞安卓的同事帮忙研究了一下,发现App在运行期间吃满单核CPU的算力。         明确原

    2024年02月11日
    浏览(33)
  • 自然语言处理(NLP)一直是人工智能领域的一项重要任务,其涉及到从文本中提取特征、组织数据、训练模型等诸多复杂任务。如何有效地进行文本理解和分析?

    作者:禅与计算机程序设计艺术 自然语言处理(NLP)一直是人工智能领域的一项重要任务,其涉及到从文本中提取特征、组织数据、训练模型等诸多复杂任务。如何有效地进行文本理解和分析,成为一个重要研究课题。近年来,随着计算能力的提升和硬件性能的增强,大规模

    2024年02月09日
    浏览(64)
  • 网页语音合成API运行无效果问题处理

    h5提供了语音合成的api,包括SpeechSynthesis、SpeechSynthesisUtterance,具体使用方法可参考语音合成(TTS)应用方案一二三_成江的博客-CSDN博客,现在的mdn上介绍说这是一个实验中的功能,但是从兼容性列表可以看到,除了移动端的opera和安卓webview,支持性是很友好的。 尽管上面提到

    2024年02月16日
    浏览(39)
  • 3、flink重要概念(api分层、角色、执行流程、执行图和编程模型)及dataset、datastream详细示例入门和提交任务至on yarn运行

    一、Flink 专栏 Flink 专栏系统介绍某一知识点,并辅以具体的示例进行说明。 1、Flink 部署系列 本部分介绍Flink的部署、配置相关基础内容。 2、Flink基础系列 本部分介绍Flink 的基础部分,比如术语、架构、编程模型、编程指南、基本的datastream api用法、四大基石等内容。 3、

    2024年02月12日
    浏览(44)
  • FastAPI 构建 API 高性能的 web 框架(一)

    如果要部署一些大模型一般langchain+fastapi,或者fastchat, 先大概了解一下fastapi,本篇主要就是贴几个实际例子。 官方文档地址: https://fastapi.tiangolo.com/zh/ 来源:大语言模型工程化服务系列之五-------复旦MOSS大模型fastapi接口服务 服务端代码: api启动后,调用代码: 来源: 大语

    2024年02月13日
    浏览(45)
  • FastAPI和Flask:构建RESTful API的比较分析

    Python 是一种功能强大的编程语言,广泛应用于 Web 开发领域。 FastAPI  和 Flask 是 Python Web 开发中最受欢迎的两个框架。本文将对 FastAPI 和 Flask 进行综合对比,探讨它们在语法和表达能力、生态系统和社区支持、性能和扩展性、开发工具和调试支持、安全性和稳定性、学习曲线

    2024年02月13日
    浏览(43)
  • FastAPI单元测试:使用TestClient轻松测试你的API

    2024软件测试面试刷题,这个小程序(永久刷题),靠它快速找到工作了!(刷题APP的天花板)_软件测试刷题小程序-CSDN博客 文章浏览阅读2.9k次,点赞85次,收藏12次。你知不知道有这么一个软件测试面试的刷题小程序。里面包含了面试常问的软件测试基础题,web自动化测试、

    2024年03月26日
    浏览(45)
  • FastAPI 构建 API 高性能的 web 框架(二)

    上一篇 FastAPI 构建 API 高性能的 web 框架(一)是把LLM模型使用Fastapi的一些例子,本篇简单来看一下FastAPI的一些细节。 有中文官方文档:fastapi中文文档 假如你想将应用程序部署到生产环境,你可能要执行以下操作: 并且安装uvicorn来作为服务器: 然后对你想使用的每个可选

    2024年02月12日
    浏览(47)
  • Flink(三)flink重要概念(api分层、角色、执行流程、执行图和编程模型)及dataset、datastream详细示例入门和提交任务至on yarn运行

    一、Flink 专栏 Flink 专栏系统介绍某一知识点,并辅以具体的示例进行说明。 1、Flink 部署系列 本部分介绍Flink的部署、配置相关基础内容。 2、Flink基础系列 本部分介绍Flink 的基础部分,比如术语、架构、编程模型、编程指南、基本的datastream api用法、四大基石等内容。 3、

    2024年02月16日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包