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应用程序中轻松地设置定时任务了。运行效果如下:

FastApi使用定时任务_第1张图片

 

一个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)

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

你可能感兴趣的:(fastapi)