首页 > 其他分享 >FastAPI 中设置定时任务的方法:从入门到精通

FastAPI 中设置定时任务的方法:从入门到精通

时间:2023-12-20 18:03:13浏览次数:29  
标签:入门 FastAPI app 任务 import 定时 def

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

FastAPI 中设置定时任务的方法:从入门到精通_定时任务

实现 FastAPI 中的定时任务

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

1. 利用 APScheduler

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

安装

pip install APScheduler

集成与初始化

from apscheduler.schedulers.background import BackgroundScheduler

scheduler = BackgroundScheduler()

定义定时函数

from datetime import datetime

def execute_periodic_function():
    print(f'定期任务执行时间:{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,app,任务,import,定时,def
From: https://blog.51cto.com/u_15964010/8909696

相关文章

  • 网络入门初学第二期
    不知不觉就把IA的基础学了个大概,经过上一期的学习,感觉对于网络设备的工作原理还是需要一个简单的总结下面我们会根据设备内部的工作机制进线学习首先我们上一期也谈到了交换机的工作原理:接受到数据帧,查看目标MAC,对应的端口转发就ok了不过上期讲的比较模糊,这期我们就从PC如何......
  • schedule 定时运行 Python 函数
    安装pipinstallschedule例子每x分钟运行一次importscheduleimporttimedefjob():print("I'mworking...")#每3秒/分钟/小时/天/周运行一次任务、#从现在开始每3秒/分钟/小时/天/周运行一次作业schedule.every(3).seconds.do(job)schedule.every(3).mi......
  • drf入门到精通 day3
    APIView执行流程分析1在路由中:path('books/',views.BookView.as_view()),请求来了#2先看as_view()---->APIView的as_view---》as_view执行结果跟之前一样,去除了csrf认证@classmethoddefas_view(cls,**initkwargs):view=super().as_view(**initkwa......
  • 《Python网络爬虫:从入门到实战》
    ......
  • requests入门
    安装Requestspipinstallrequests发送请求接口:https://api.github.com/events获取接口信息r=requests.get('https://api.github.com/events')之后获取的信息都是从r对象来的其他的请求类型:#post类型r=requests.post('http://httpbin.org/post',data={'key':'......
  • 内核模块(.ko) 开发入门
    内核模块时指的是在操作系统内核中动态加载的一段代码,它可以扩展和增强操作系统的功能。内核模块通常用于为操作系统添加新的设备驱动程序、文件系统、网络协议栈等功能。内核模块是以二进制形式存在的(*.ko),它们被编译为对象文件,并在运行时被加载到操作系统内核中。内核模块与操作......
  • SpringBoot入门三十四,自定义Springboot Starter
    1.前言SpringBootStarter是一种用于简化SpringBoot应用程序配置的机制。通过自定义Starter,我们可以将一组相关的配置、依赖和自动配置打包成一个可重用的模块,使得其他开发者可以轻松地集成和使用。本篇文章将引导你创建一个简单的自定义SpringBootStarter,并演示如何在应用程序......
  • 鸿蒙开发入门:Stage模型应用程序包结构
    Stage模型应用程序包结构基于Stage模型开发的应用,经编译打包后,其应用程序包结构如下图**应用程序包结构(Stage模型)**所示。开发者需要熟悉应用程序包结构相关的基本概念。在开发态,一个应用包含一个或者多个Module,可以在DevEcoStudio工程中创建一个或者多个Module。Module是HarmonyO......
  • 入门篇-其之十一-流程控制之break和continue关键字
    本文中使用到的工具是IntellijIDEA和JDK8,需要安装两款工具的请查看这两篇教程:点我查看安装JDK8/11/17教程、点我查看安装IntellijIDEA教程。一、循环的嵌套和前面学习if一样,循环也可以相互搭配嵌套,即一个循环内部还包含一个循环。在编写嵌套循环时,三种循环(for、while、do-w......
  • 【SpringBootWeb入门-15】Mybatis-基础操作-增改查操作
    1、章节回顾上一篇文章我们讲解了Mybatis的删除操作,本篇继续学习Mybatis的新增操作:根据员工表字段,新增员工表的数据,新增的字段有:用户名、员工姓名、性别、图像、职位、入职日期、归属部门。2、增删改查操作-新增操作员工表emp新增数据,对应的SQL语句:insertintoemp(username......