python 定时任务实现方式可采用:schedule,Threading模块中的Timer,sched,APScheduler,celery
django 定时任务可选:django-crontab,
APScheduler,schedule,django-celery
本文介绍apscheduler库的使用
APSScheduler是python的一个定时任务框架,它提供了基于日期date、固定时间间隔interval、以及linux上的crontab类型的定时任务。该矿机不仅可以添加、删除定时任务,还可以将任务存储到数据库中、实现任务的持久化。
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。
最常用的两种executor :ProcessPoolExecutor 和 ThreadPoolExecutor,其它的还有AsyncIOExecutor、DebugExecutor(一种特殊的执行程序,直接执行可调用的目标,而不是将其延迟给线程或进程)、GeventExecutor、TwistedExecutor。
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)
步骤:
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()
包含:执行方法,调度器对象
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()
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中的完整使用一般还包含任务的存储,执行信息等,需增加数据存储与展示相关功能
参考:
https://apscheduler.readthedocs.io/en/stable/ -- 官方
https://zhuanlan.zhihu.com/p/95563033
https://blog.csdn.net/wuyongpeng0912/article/details/88895659