FastApi使用定时任务

# 使用命令进行安装
pip install apscheduler

在 FastAPI 中使用定时任务可以通过使用 APScheduler 库来完成,APScheduler 是一个轻量级的Python定时任务框架。使用APScheduler,您可以在FastAPI中运行周期性的任务。下面是示例代码:

from apscheduler.schedulers.asyncio import AsyncIOScheduler
from fastapi import FastAPI
from datetime import datetime

app = FastAPI()

# 创建一个scheduler实例
scheduler = AsyncIOScheduler()

# 每分钟执行的定时任务
@scheduler.scheduled_job('interval', minutes=1)
async def cron_job():
    # 执行任务的内容,例如打印当前时间
    print(f"The current time is {datetime.now()}")

# 启动scheduler
@app.on_event("startup")
   async def startup_event():
      log.info("FastApi服务启动")
      # 创建数据库表
      await create_table()
      # 启动定时任务
      log.info("定时任务启动")
      scheduler.start()
@app.on_event("shutdown")
   async def shutdown_event():
      log.info("FastApi服务关闭")
      scheduler.shutdown()
      log.info("定时任务关闭")

 

在这个示例中,我们首先导入APScheduler库和FastAPI,然后创建一个AsyncIOScheduler实例,并使用@scheduler.scheduled_job装饰器来指定我们希望调度的任务,这里是每分钟执行一次的任务。任务函数cron_job()中可以执行我们需要执行的操作,例如打印当前时间。

最后,我们通过调用scheduler.start()命令启动定时任务调度程序。

需要注意的是,使用 FastAPI 中的定时任务时,需要在应用退出时停止调度器并释放资源。您可以使用以下代码在FastAPI应用程序结束时停止调度器:

@app.on_event("shutdown")
async def shutdown_event():
    scheduler.shutdown()

 

这样,就可以在FastAPI应用程序中轻松地设置定时任务了。运行效果如下:

45d162347f4b4e7abb9333d6ddc6ca17.png

 

一个AsyncIOScheduler实例可以同时运行多个周期性或者一次性任务,你可以通过添加多个任务来实现。下面是一个添加两个任务的示例代码:

from apscheduler.schedulers.asyncio import AsyncIOScheduler
from datetime import datetime, timedelta

scheduler = AsyncIOScheduler()

# 定义两个任务
@scheduler.scheduled_job('interval', seconds=10)  # 每10秒执行一次
async def task1() -> None:
    print(f'Task 1 executed at {datetime.now()}')

@scheduler.scheduled_job('interval', minutes=1)  # 每分钟执行一次
async def task2() -> None:
    print(f'Task 2 executed at {datetime.now()}')

 

在这个示例中,我们定义了两个任务:task1 每10秒执行一次,task2 每分钟执行一次。在启动调度器后,这两个任务将会同时运行。

需要注意的是,当有多个任务共享同一线程池时,它们之间的执行会相互影响。如果你希望不同的任务在彼此之间进行隔离,可以通过调用 AsyncIOScheduler 的 add_job 方法去为每个任务独立的分配线程池,例如:

scheduler.add_job(task1, 'interval', seconds=5)
scheduler.add_job(task2, 'interval', minutes=1)

 

这样就可以为每个任务分配自己的线程池、避免相互干扰,从而一次性运行多个任务。在支持异步任务的调度器中,可以并发执行多个任务,大大提高了任务的执行效率。

个人博客网站,灵动空间,欢迎访问

  • 6
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值