前段时间有个晓需求需用到定时任务,由于在同服务器上部署的是Sanic服务,因此就想在sanic框架上使用定时任务。
根据sanic官方给出的文档:
# 定时任务函数
async def taskFunc(app):
while True:
await asyncio.sleep(3)
# 执行SQL语句
sql_str = "SELECT * FROM Students"
res = await sanicdb.query(sql_str )
# 处理返回结果
print(res)
# 启动
app.add_task(taskFunc(app))
使用根据实际测试,使用
await asyncio.sleep(3)
代码可以实现每隔XX时间开展XXX任务,但是对于每天X点做什么任务这种不适用。
在python下常规使用APScheduler定时框架,做定时任务,因此尝试把sanic和APScheduler结合使用。经过实践测试,通过以下代码可以实现两者结合的定时任务:
# 定时任务函数 ,此处可以是async。也可以不是异步函数
async def theTaskFun():
logger.info(f'测试新增每日定时任务!')
# 具体函数功能
# -------------------------------------------------
from apscheduler.schedulers.blocking import BlockingScheduler
async def taskJob(app):
while True:
sched = BlockingScheduler()
# 每十分钟执行一次任务
sched.add_job(theTaskFun, 'interval', minutes=10, id='my_job', jitter=120)
# 在每天7点,每隔 5分钟 运行一次 job 方法
sched.add_job(theTaskFun, 'cron', hour=7, minute='*/5')
sched.add_job(theTaskFun, 'cron', hour=18, minute='05')
# 在每天16和17点的10分,运行一次 job 方法
# sched.add_job(theTaskFun, 'cron', hour='16-17', minute='10')
# 此处的功能函数可以是完全不同的几个函数,另外也可以在其他.py文件中引入可执行函数
await sched.start()
app.add_task(taskJob(app))