基于Fastapi實(shí)現(xiàn)定時(shí)任務(wù)
簡(jiǎn)介
定時(shí)任務(wù)是一個(gè)通用場(chǎng)景常見(jiàn)的功能,之前我使用django的時(shí)候,更習(xí)慣使用celery中的定時(shí)任務(wù),現(xiàn)在花時(shí)間看了看
apscheduler感覺(jué)不錯(cuò),就寫(xiě)了demo,并集成到項(xiàng)目代碼中了
任務(wù)調(diào)度主要就是以下幾個(gè)功能
添加/刪除 任務(wù)調(diào)度
暫停/恢復(fù) 任務(wù)調(diào)度(這條我未實(shí)現(xiàn))
查看定時(shí)任務(wù)狀態(tài)
實(shí)現(xiàn)

添加定時(shí)任務(wù)
其中添加定時(shí)任務(wù)方式,有以下三種方式
date: 固定的時(shí)間執(zhí)行一次時(shí) 用這種
interval: 想要在固定的間隔時(shí)間循環(huán)執(zhí)行時(shí)用這種
cron: 這種就是最為靈活的?
crontab?表達(dá)式定時(shí)任務(wù)了
在FastAPI異步框架中,選擇?AsyncIOScheduler調(diào)度程序
默認(rèn)使用sqlite持久化定時(shí)任務(wù),不至于重啟就失效
from apscheduler.schedulers.asyncio import AsyncIOSchedulerfrom apscheduler.jobstores.sqlalchemy import SQLAlchemyJobStorefrom apscheduler.triggers.cron import CronTriggerSchedule = AsyncIOScheduler(jobstores={'default': SQLAlchemyJobStore(url='sqlite:///jobs.sqlite')})Schedule.start()
不完善的地方
1 由于時(shí)間倉(cāng)促,比如參數(shù)驗(yàn)證的部分,參數(shù)數(shù)據(jù)校驗(yàn),還可以繼續(xù)完善。
2 添加調(diào)度任務(wù)參數(shù)封裝,我把三種添加任務(wù)的三種方式,拆成了三個(gè)函數(shù),其中很多參數(shù)沒(méi)有用到。
3 其中文檔中還有說(shuō)明最大woker數(shù)量限制之類的,然后按照我使用其他定時(shí)任務(wù)的常識(shí),應(yīng)該還會(huì)函數(shù)最長(zhǎng)執(zhí)行時(shí)間限制(比如執(zhí)行的功能函數(shù)特別耗時(shí))
4 ...等等
這些就需要自己查看文檔和issues搜索了
其他方案
定時(shí)任務(wù)有很多種方案,比如可以使用
arq?https://github.com/samuelcolvin/arq?目前看來(lái) star數(shù)量不多fastapi-utils?https://github.com/dmontagu/fastapi-utilscelery?https://github.com/celery/celery Celery就是Python中最為重量級(jí),且常見(jiàn)的任務(wù)隊(duì)列, 你也可以只用其中的定時(shí)任務(wù)功能。
說(shuō)到
arq, 想起我之前,使用過(guò)rq?并且學(xué)習(xí)的時(shí)候稍微翻譯了一下文檔 rq v1.0 https://codercharm.github.io/Python-rq-doc-cn/#/?一晃過(guò)去一年了。
代碼地址
單文件例子:?https://github.com/CoderCharm/fastapi-mysql-generator/blob/master/examples/demo_scheduler/main.py
項(xiàng)目中使用:?https://github.com/CoderCharm/fastapi-mysql-generator/blob/master/{{cookiecutter.project_name}}/app/api/__init__.py#L230
參考地址
apscheduler官方文檔
FastAPI issues
原文來(lái)自
https://www.cnblogs.com/CharmCode/p/14191009.html
10T 技術(shù)資源大放送!包括但不限于:Linux、虛擬化、容器、云計(jì)算、網(wǎng)絡(luò)、Python、Go 等。在?開(kāi)源Linux?公眾號(hào)內(nèi)回復(fù)?10T,即可免費(fèi)獲??!
有收獲,點(diǎn)個(gè)在看?



