一.前言
python 定时任务实现方式可采用:schedule,Threading模块中的Timer,sched,APScheduler,celery
django 定时任务可选:django-crontab,
APScheduler,schedule,django-celery
本文介绍apscheduler库的使用
二.简介
APSScheduler是python的一个定时任务框架,它提供了基于日期date、固定时间间隔interval、以及linux上的crontab类型的定时任务。该矿机不仅可以添加、删除定时任务,还可以将任务存储到数据库中、实现任务的持久化。
三.APScheduler有四种组件:
-
triggers(触发器):触发器包含调度逻辑,每一个作业有它自己的触发器,用于决定接下来哪一个作业会运行,除了他们自己初始化配置外,触发器完全是无状态的。
-
job stores(作业存储):用来存储被调度的job,默认的作业存储器是简单地把job保存在内存中,其它job存储器可以将job保存到各种数据库中,支持MongoDB、Redis、sqlalchemy存储方式。Job的数据在保存到持久化存储时被序列化,并在加载时进行反序列化。job存储(默认存储除外)不将job数据保存在内存中,而是充当后台保存、加载、更新和搜索job的中间人。job存储永远不能在调度程序之间共享。
-
executors(执行器):执行器用来执行定时任务,只是将需要执行的job放在新的线程或者线程池中运行。当job完成时,执行器将会通知调度器。对于执行器,默认情况下选择ThreadPoolExecutor就可以了,但是如果涉及到一下特殊任务如比较消耗CPU的任务则可以选择ProcessPoolExecutor,当然根据根据实际需求可以同时使用两种执行器。
-
schedulers(调度器):调度器是将其它部分联系在一起,一般在应用程序中只有一个调度器,应用开发者不会直接操作触发器、job存储以及执行器,相反调度器提供了处理的接口。通过调度器完成job存储以及执行器的配置操作,如可以添加。修改、移除job。
3.1 调度程序
- BlockingScheduler:当调度程序是您的流程中唯一运行的东西时使用
- BackgroundScheduler:在不使用以下任何框架且希望调度程序在应用程序内部的后台运行时使用
- AsyncIOScheduler:如果您的应用程序使用asyncio模块,则使用
- GeventScheduler:如果您的应用程序使用gevent,则使用
- TornadoScheduler:在构建Tornado应用程序时使用
- TwistedScheduler:在构建Twisted应用程序时使用
- QtScheduler:在构建Qt应用程序时使用
3.2 job存储库
- MemoryJobStore
- sqlalchemy
- mongodb
- redis
3.3 执行器
最常用的两种executor :ProcessPoolExecutor 和 ThreadPoolExecutor,其它的还有AsyncIOExecutor、DebugExecutor(一种特殊的执行程序,直接执行可调用的目标,而不是将其延迟给线程或进程)、GeventExecutor、TwistedExecutor。
3.4 触发器
-
data:固定日期触发器:任务只运行一次,运行完毕自动清除;若错过指定运行时间,任务不会被创建
-
interval:周期性触发
-
cron:cron风格的任务触发
配置示例:
from pytz import utc
from apscheduler.schedulers.background import BackgroundScheduler
from apscheduler.jobstores.mongodb import MongoDBJobStore
from apscheduler.jobstores.sqlalchemy import SQLAlchemyJobStore
from apscheduler.executors.pool import ThreadPoolExecutor, ProcessPoolExecutor
jobstores = {
'mongo': MongoDBJobStore(),
'default': SQLAlchemyJobStore(url='sqlite:///jobs.sqlite')
}
executors = {
'default': ThreadPoolExecutor(20),
'processpool': ProcessPoolExecutor(5)
}
job_defaults = {
'coalesce': False,
'max_instances': 3
}
scheduler = BackgroundScheduler(jobstores=jobstores, executors=executors, job_defaults=job_defaults, timezone=utc)
四. apscheduler基本使用
步骤:
1)新建scheduler调度器(选择一种scheduler执行实例化操作)
scheduler = BackgroundScheduler()
2)向调度器添加一个job调度任务
scheduler.add_job(func1, 'interval', days = 1,start_date = "2021-02-04 12:00:00")
3)运行job调度任务
scheduler.start()
demo:
import time, json
from apscheduler.schedulers.background import BackgroundScheduler
def clear_log():
.....
....
# 采用非阻塞的方式
scheduler = BackgroundScheduler()
now = time.time() + 2
struct_time = time.localtime(now)
str_time = time.strftime("%Y-%m-%d %H:%M:%S", struct_time)
scheduler.add_job(clear_log, 'interval', days = 1,start_date = str_time_clear)
scheduler.start()
五.django中使用apscheduler
5.1 结合apscheduler封装的文件
包含:执行方法,调度器对象
import time, json
from apscheduler.schedulers.background import BackgroundScheduler
def function1(par1,par2):
.....
....
def function2():
....
....
# 采用非阻塞的方式
scheduler = BackgroundScheduler()
now = time.time() + 2
struct_time = time.localtime(now)
str_time = time.strftime("%Y-%m-%d %H:%M:%S", struct_time)
scheduler.add_job(function2, 'interval', days = 1,start_date = str_time_clear)
scheduler.start()
5.2 view文件
from utils.schedule_job import scheduler
from utils.common import function1
@require_http_methods(["POST"])
def schduler_task(request):
data = json.loads(request.body)
trigger = data.get('trigger','date') #取触发类型参数
runtime = data.get('runtime') #取任务执行时间参数
params = data.get('params') #取调度函数的参数
name = data.get('name') #取任务名
scheduler.add_job(func=function1, trigger=trigger , kwargs=params,run_date=runtime,name=name)
if not scheduler.running:
scheduler.start()
return JsonResponse(ReturnMsg(data='....').dict())
django中的完整使用一般还包含任务的存储,执行信息等,需增加数据存储与展示相关功能
参考:
Advanced Python Scheduler — APScheduler 3.9.1 documentation -- 官方
Python定时库APScheduler原理及用法 - 知乎
Python定时任务-APScheduler_HelloWuyp的博客-CSDN博客_python定时任务apscheduler