如何在 FastAPI 中设置定时任务:完全指南

Web 应用程序开发中,及时高效处理常规任务至关重要,包括定时收集数据或管理任务计划。针对强大且性能卓越的 FastAPI 框架,我们可以通过几种策略来管理这些必要的定时任务。

image.png

实现 FastAPI 中的定时任务

本指南将探讨在 FastAPI 环境中管理定时任务的三种实用方法:使用 APScheduler,利用 Celery 任务队列的力量,以及利用内置的 asyncio 进行调度。

1. 利用 APScheduler

APScheduler 是 Python 调度库,以其灵活性和易于集成而著称。以下是如何在 FastAPI 中使用它:

安装
pip install APScheduler
集成与初始化
from apscheduler.schedulers.background import BackgroundScheduler

scheduler = BackgroundScheduler()
定义定时函数
def tick():
    print('Tick! The time is: %s' % datetime.now()) 
在 FastAPI 初始化后启动 APScheduler
from fastapi import FastAPI

app = FastAPI()

@app.on_event("startup")
async def app_start():
    scheduler.add_job(execute_periodic_function, 'interval', seconds=3)
    scheduler.start()

2. 使用 Celery

Celery 是一个高效的分布式任务队列系统,可与 FastAPI 无缝集成。

设置 Celery
pip install celery
定义 Celery 应用与任务
from celery import Celery

celery_app = Celery('my_fastapi_app')

@celery_app.task
def celery_periodic_task():
    print('执行了 Celery 任务')
在 FastAPI 启动时安排任务
from celery.schedules import crontab

@app.on_event("startup")
async def app_start():
    celery_app.conf.beat_schedule = {
        '每半分钟执行': {
            'task': 'celery_periodic_task',
            'schedule': 30.0,
        },
    }

3. 使用 Asyncio 进行定时任务

Python 的原生异步库 asyncio 也可用于调度定时任务。

Asyncio 定时任务示例
import asyncio

@app.on_event("startup")
async def app_start():
    asyncio.create_task(async_cron())

async def async_cron():
    while True:
        print('执行 Async 定时任务')
        await asyncio.sleep(10)
实践示例:使用 APScheduler

以下是完整的使用 APScheduler 管理定时任务的 FastAPI 应用示例:

from fastapi import FastAPI
from datetime import datetime
from apscheduler.schedulers.background import BackgroundScheduler

app = FastAPI()
scheduler = BackgroundScheduler()

def periodic_function():
    print(f'定时执行的操作时间:{datetime.now()}')

@app.on_event("startup")
async def app_start():
    scheduler.add_job(periodic_function, 'interval', seconds=3)
    scheduler.start()

@app.get("/")
async def welcome():
    return {"message": "欢迎访问定时任务演示"}

if __name__ == "__main__":
    import uvicorn
    uvicorn.run(app, host="127.0.0.1", port=8000)
提示、技巧及注意事项
  • 使用 Celery 时,请确保已安装并配置 Redis(或其他消息代理)。
  • 注意任务执行时长,避免对应用性能产生负面影响。
  • 使用 try-except 模块处理定时任务中的异常,并执行适当的错误处理。

使用 Apifox 这样的工具可以简化 API 测试,这是 Postman 等竞品的更强大的替代品。Apifox 将 Postman、Swagger、Mock 和 JMeter 的功能整合在一起,简化了对各种协议 API 的调试,提高了项目投产效率。

结论

无论选择 APScheduler、Celery 还是 asyncio,FastAPI 都为实现定时任务提供了强大的解决方案。每种方法都有其优点,APScheduler 使用友好,asyncio 与 FastAPI 的异步特性相契合。根据您的具体需求和场景选择最合适的方法。

知识扩展:

  • FastAPI 中的 depends 怎么使用?FastAPI 中 depends 的使用方法
  • FastAPI 中怎么进行鉴权?在 FastAPI 中鉴权的方法

参考链接:

  • APScheduler Documentation: https://apscheduler.readthedocs.io/en/latest/index.html
  • Celery Documentation: https://docs.celeryq.dev/en/stable/index.html
  • asyncio Documentation: https://docs.python.org/3/library/asyncio.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/261045.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Git初始

一)git的介绍: 1)假设现在有一个文档,你的老板要求你针对于这份文件进行修改,进行完成的修改的版本是版本1,接下来是文档2,修改完文档2以后,接下来老板还不同意,于是又有了文档三,文档四&#x…

Ubuntu 常用命令之 less 命令用法介绍

📑Linux/Ubuntu 常用命令归类整理 less命令是一个在Unix和Unix-like系统中用于查看文件内容的命令行工具。与more命令相比,less命令提供了更多的功能和灵活性,例如向前和向后滚动查看文件,搜索文本,查看长行等。 les…

算法和算法分析

一个问题抽象为一个抽象数据类型后,仅是形式上的抽象定义,还没有达到问题解决的目的,要实现这个目标,就要吧抽象的变成具体的,即抽象数据类型再计算机上实现,变为一个能用的具体的数据类型! …

Unity | Shader基础知识(第八集:案例<漫反射材质球>)

目录 一、本节介绍 1 上集回顾 2 本节介绍 二、什么是漫反射材质球 三、 漫反射进化史 1 三种算法结果的区别 2 具体算法 2.1 兰伯特逐顶点算法 a.本小节使用的unity自带结构体。 b.兰伯特逐顶点算法公式 c.代码实现——兰伯特逐顶点算法 2.2 代码实现——兰伯特逐…

如何开启In-sensor zoom 功能

和你一起终身学习,这里是程序员Android 经典好文推荐,通过阅读本文,您将收获以下知识点: 一、In-sensor zoom 概述二、如何开启 In-sensor zoom2.1 开启 camxsettings.xml setting2.2 多摄像头,需要添加特殊的逻辑2.3 在 MetaTran…

记录下IAP升级将APP程序修改正常模式下载失败 No Algorithm found for: 08000000H - 08008FFFH

移植发现问题: No Algorithm found for: 08000000H - 08008FFFH 今天在调试程序时,需要把钱同事程序的APP修改成成正常下载就可以用的程序,工程的地址复位也把APP的偏移地址去掉,理论上这样就OK了 偏移地址设置也屏蔽了 STLINK下…

美摄AE模板插件工具,将美摄SDK和AE极致融合

视频内容已经成为企业宣传和品牌建设的重要手段,为了满足企业对于高质量视频制作的需求,美摄科技推出了一款创新性的插件工具——美摄AE模板插件工具。这款工具将美摄SDK能力和Adobe After Effects极致融合,为企业提供了一种快速制作和转化美…

vue 历程记

目录 前言一、源码优化1、vue3.x 采用 monorep 的理念来管理源码2、vue3.x 源码采用 TypeScript 开发 二、性能优化1、减少源码的体积2、数据劫持优化3、编译优化(1)、编译粒度的优化 三、语法 API 的优化1、优化了编码的逻辑组织2、优化了代码的逻辑复用…

Java学习系列(四)

1.Scanner类 java.util.Scanner 是 Java5 的新特征,我们可以通过 Scanner 类来获取用户的输入。 import java.util.Scanner; public class ScannerDemo {public static void main(String[] args) {Scanner scan new Scanner(System.in);// 从键盘接收数据// next…

css学习笔记2

css学习笔记2 CSS三大特性1.三大特性1.1层叠性1.2继承性1.3优先级 2.颜色的表示2.1表示方式一:颜色名2.2表示方式二:rgb或rgba2.3表示方式三:HEX或HEXA2.4表示方式四:HSL或HSLA CSS三大特性 1.三大特性 1.1层叠性 概念&#xff…

SLAM算法与工程实践——SLAM基本库的安装与使用(6):g2o优化库(1)g2o库的安装

SLAM算法与工程实践系列文章 下面是SLAM算法与工程实践系列文章的总链接,本人发表这个系列的文章链接均收录于此 SLAM算法与工程实践系列文章链接 下面是专栏地址: SLAM算法与工程实践系列专栏 文章目录 SLAM算法与工程实践系列文章SLAM算法与工程实践…

如何提高React组件的渲染效率的?在React中如何避免不必要的render?

面试官:说说你是如何提高组件的渲染效率的?在React中如何避免不必要的render? 一、是什么 react 基于虚拟 DOM 和高效 Diff 算法的完美配合,实现了对 DOM 最小粒度的更新,大多数情况下,React 对 DOM 的渲染…

debian10安装配置vim+gtags

sudo apt install global gtags --version gtags //生成gtag gtags-cscope //查看gtags gtags与leaderf配合使用 参考: 【VIM】【LeaderF】【Gtags】打造全定制化的IDE开发环境! - 知乎

Apache Superset如何实现无公网ip实时远程访问本地数据【内网穿透】

文章目录 前言1. 使用Docker部署Apache Superset1.1 第一步安装docker 、docker compose1.2 克隆superset代码到本地并使用docker compose启动 2. 安装cpolar内网穿透,实现公网访问3. 设置固定连接公网地址 前言 Superset是一款由中国知名科技公司开源的“现代化的…

生物信息学R分析工具包ggkegg的详细使用方法

ggkegg介绍 ggkegg 是一个用于生物信息学研究的工具,可以用于分析和解释基因组学数据,并将其与已知的KEGG数据库进行比较。ggkegg 是从 KEGG 获取信息并使用 ggplot2 和 ggraph 进行解析、分析和可视化的工具包,结合其他使用 KEGG 进行生物功…

HAproxy做七层代理+keepalived高可用,实现动静分离,由nginx处理静态页面,tomcat处理动态页面

目录 一、三种软负载均衡器的区别 关于三种负载均衡器的性能对比: 关于三种负载均衡器的代理类型对比: 关于三种负载均衡器的健康检查对比: 二、haproxy的8中负载均衡调度算法 haproxy的会话保持的方式 haproxy的配置文件学习 三、实操…

Python中导入Excel数据:全面解析与实践

目录 一、引言 二、选择合适的库 三、读取Excel文件 四、处理数据 五、错误处理和异常处理 1、使用try-except语句捕获和处理异常: 2、使用try-except语句捕获和处理特定异常类型: 六、性能优化 七、数据验证 1、检查缺失值: 2、检…

如何解决idea创建版本时只有Java21和Java17选项

idea如果版本高了就会出现在创建Springboot项目时只有Java21和Java17选项 选择jdk1.8的时候很可能出现下图报错,这是因为版本jdk1.8与Java17不兼容 解决办法一般有三种,这里列举两种 1、替换下载数据源 可以将https://start.spring.io/ 替换成 https:…

科普-电子合同签署,这三步不能忽视

关于电子合同,许多人认为我自己直接内部发送邮件/传真等发送电子版合同或者我自己创建一个电子合同平台,这种怎么不属于电子合同呢? 在这里给大家科普一个知识点:签电子合同,需要经过这“三个步骤”。 根据《电子签名…

31. 深度学习进阶 - 全连接层及网络结构

Hi,你好。我是茶桁。 之前的课程咱们学习了卷积以及池化,那到底卷积是如何构成卷积神经网络的呢?我们这节课来好好讲一下。 全连接层 整个卷积的运算就是经过卷积,再经过pooling,再经过卷积。会把这个图形变的很小。…