fastApI 定时任务apscheduler

重要使用库的版本

1
2
3
APScheduler         3.6.3
fastapi             0.61.1
websockets          8.1

apscheduler 的使用

APSScheduler是python的一个定时任务框架,它提供了基于日期date、固定时间间隔interval、以及linux上的crontab类型的定时任务。该框架不仅可以添加、删除定时任务,还可以将任务存储到数据库中、实现任务的持久化。
apscheduler详细的使用说明查看
在这里插入图片描述

此实例的使用场景

其他服务调用FastAPI 中的add_job添加任务接口;
其他服务调用FastAPI 中的remove_job删除任务接口;
在任务到点后,使用websockets 进行消息通知;

在项目启动时开始scheduler定时器

1
2
3
4
5
6
7
8
9
10
11
12
@app.on_event('startup')
def init_scheduler():
    """初始化"""
    jobstores = {<!-- -->
        'default': SQLAlchemyJobStore(url='mysql+pymysql://root:Aa111***##@43.239.120.21:3306/teacher?charset=utf8')  # SQLAlchemyJobStore指定存储链接
    }
    global scheduler
    # scheduler = BackgroundScheduler()
    scheduler = AsyncIOScheduler()
    scheduler.configure(jobstores=jobstores)

    scheduler.start()

添加任务接口
await manager.broadcast(json.dumps(s[‘msg’]), s[‘rec’]) # 查看另一篇博客 FastAPI WebSocket

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
async def print_time(s):
    print(s,'ssssss')
    global manager
    await manager.broadcast(json.dumps(s['msg']), s['rec'])  # 查看另一篇博客
    return 'ok'

class JobItem(BaseModel):
    job_id: str
    cron: str
    data: dict
   
@app.post('/add_job/')
async def add_job(item: JobItem):
    print(item, 'xxx')
    job_id = item.job_id
    data = item.data
    cron = datetime.datetime.strptime(item.cron, '%Y-%m-%d %H:%M:%S')

    """添加job"""
    global scheduler
    scheduler.add_job(print_time, 'date', next_run_time=cron, args=[data, ], id=job_id)
    return {<!-- -->"msg": "success!"}

删除任务接口

1
2
3
4
5
6
7
8
9
10
@app.post('/remove_job/')
async def remove_job(item: JobItem):
    """移除job"""
    print(item.job_id, 'hahaha')
    try:
        global scheduler
        scheduler.remove_job(item.job_id)
        return {<!-- -->"msg": "success!"}
    except:
        return {<!-- -->"msg": "s"}