开发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 从业者,本书都能满足您的需求。 那为什么还要等呢?

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

北大出版社,人工智能原理与实践 人工智能和数据科学从入门到精通 详解机器学习深度学习算法原理

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好!对于FastAPI后端开发,我可以提供一些基本信息和帮助。FastAPI是一个基于Python的现代、快速(高性能)的Web框架,它具有简洁的语法和强大的功能。下面是一些关于FastAPI后端开发的常见问题和主题: 1. 如何开始使用FastAPI? 您可以使用pip安装FastAPI并创建一个新的项目。然后,您可以定义路由、编写处理函数,并使用FastAPI的装饰器和模型来处理请求和响应。 2. FastAPI的优势是什么? FastAPI具有很多优点,包括:高性能、自动文档生成、类型提示、异步支持、API验证、快速开发以及与其他Python生态系统工具(如Pydantic、SQLAlchemy等)的兼容性等。 3. 如何处理请求和响应? 在FastAPI中,您可以使用装饰器(如`@app.get`、`@app.post`等)来定义路由和请求方法,并编写处理函数来处理请求和生成响应。您可以访问请求参数、路径参数、查询参数等,并使用Pydantic模型验证输入和输出数据。 4. 如何进行身份验证和授权? FastAPI支持各种身份验证和授权方法,包括OAuth2、JWT等。您可以使用FastAPI的内置工具或第三方库来实现身份验证和授权逻辑。 5. 如何进行数据库操作? FastAPI本身并不限制您使用的数据库,您可以选择使用SQLAlchemy、ORM或其他适合您的数据库工具。您可以在处理函数中编写数据库操作代码,或者将数据库操作封装到单独的模块中。 这些只是一些常见的问题和主题,如果您有更具体的问题或需要更详细的指导,请随时提问!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值