系统 | 支持 |
---|---|
Linux | √ |
Windows | √ |
触发器 | 中文 | 释义 |
---|---|---|
interval | 固定时间间隔 | 当您要以固定的时间间隔运行作业时使用 |
date | 固定时间点(日期) | 在您希望在某个特定时间仅运行一次作业时使用 |
cron | Crontab 命令 | 以crontab的方式运行定时任务 |
redis持久化存储时,使用APScheduler,使数据同步。
用户下单后使用,规定30min内必须支付,否则取消订单。
可以独立运行,也可以放在程序(如Django、Flask)中。
灵活,可以在程序开始前开启定时任务,也可以执行到某个任务时,立即可开启定时任务。(下单30min后取消)
如果依赖程序的话,会占用程序资源;
pip install django-apscheduler
或者
pip install apscheduler
复制,tab键补全版本
pip install zipp
## pip install importlib-resources 包名,装下面的下划线
pip install importlib_resources
pip install backports.zoneinfo
pip install tzdata
pip install pytz_deprecation_shim-
## pip install importlib-metadata 包名,装下面的下划线
pip install importlib_metadata
pip install tzlocal
pip install APScheduler
## pip install django-apscheduler 包名,装下面的下划线
pip install django_apscheduler
INSTALLED_APPS = [
...
'django_apscheduler', # 新加入的定时任务插件django-apscheduler
]
django_apscheduler_djangojob——用于存储任务的表格
django_apscheduler_djangojobexecution——用于存储任务执行状态的表格
import time
from apscheduler.schedulers.background import BackgroundScheduler
from django_apscheduler.jobstores import DjangoJobStore, register_job, register_events
print('django-apscheduler')
## 实例化调度器
scheduler = BackgroundScheduler()
## 调度器使用DjangoJobStore()
scheduler.add_jobstore(DjangoJobStore(), "default")
## 添加任务1
## 每隔5s执行这个任务
@register_job(scheduler,"interval", seconds=5,args=['王路'],id='job1', replace_existing = True)
## 每天8点半执行这个任务
## @register_job(scheduler, 'cron', id='test', hour=8, minute=30,args=['test'], replace_existing = True)
def job1(name):
# 具体要执行的代码
print('{} 任务运行成功!{}'.format(name,time.strftime("%Y-%m-%d %H:%M:%S")))
## 监控任务——注册定时任务
register_events(scheduler)
## 调度器开始运行
scheduler.start()
replace_existing = True
这个参数解决第二次启动失败的问题
'Job identifier (job1) conflicts with an existing job'
序号 | 参数名 | 参数释义 | 例子 | 注释 |
---|---|---|---|---|
1 | scheduler | 指定调度器 | ||
2 | trigger | 任务执行的方式,共有三种: “date”、”interval”、”cron”。 | ||
2.1 | “date” + “run_date” 的参数组合, 能实现单次任务。 | 例子: 2019-07-07 22:49:00 执行任务@register_job(scheduler, "date", id="test", run_date="2019-07-07 22:49:00") |
注:在亲测时,执行完任务会报错,原因时执行完任务后会去mysql中删除djangojob表中的任务。但是djangojobexecution表记录着执行结果,有外键关联着djangojob表,所以删除时显示有外键约束错误。但是任务会正常执行,执行之后也会正常删除。 | |
2.2 | “interval” + “hours” + “minutes” + … 的参数组合,能实现间隔性任务。 | 例子:每隔3个半小时执行任务@register_job(scheduler, "interval", id="test", hours=3, minutes=30) 还有seconds,days参数可以选择 |
注:如果任务需要执行10秒,而间隔设置为1秒,它是不会给你开10个线程同时去执行10个任务的。它会错过其他任务直到当前任务完成。 | |
2.3 | “cron” + “hour” + “minute”+…的参数组合,能实现cron类的任务。 | 例子:每天的8点半执行任务@register_job(scheduler, "cron", id="test", hour=8, minute=30) 还有day,second,month等参数可以选择。 |
||
3 | id | 任务的名字,不传的话会自动生成。不过为了之后对任务进行暂停、开启、删除等操作,建议给一个名字。并且是唯一的,如果多个任务取一个名字,之前的任务就会被覆盖。 | ||
4 | args | list类型。执行代码所需要的参数。 | ||
5 | next_run_time | datetime类型。开始执行时间。如果你现在创建一个定时任务,想3天后凌晨三点半自动给你女朋友发微信,那就需要这个参数了。 |
python manage.py runserver
Django启动,就启动
APScheduler 有四种组件,分别是:调度器(scheduler),作业存储(job store),触发器(trigger),执行器(executor)。
序号 | 器名 | 参数释义/ | 注释 |
---|---|---|---|
1/4 | schedulers(调度器) | 它是任务调度器,属于控制器角色。 | 它配置作业存储器和执行器可以在调度器中完成,例如添加、修改和移除作业。 |
1.1 | BlockingScheduler | 调度器在当前进程的主线程中运行,也就是会阻塞当前线程。 | |
1.2 | BackgroundScheduler | 调度器在后台线程中运行,不会阻塞当前线程。(Django框架使用) | |
1.3 | AsyncIOScheduler | 结合 asyncio 模块(一个异步框架)一起使用。 | |
1.4 | GeventScheduler | 程序中使用 gevent(高性能的Python并发框架)作为IO模型,和 - GeventExecutor 配合使用。 | |
1.5 | TornadoScheduler | 程序中使用 Tornado(一个web框架)的IO模型,用 ioloop.add_timeout 完成定时唤醒。 | |
1.6 | TwistedScheduler | 配合 TwistedExecutor,用 reactor.callLater 完成定时唤醒。scrapy爬虫框架 | |
1.7 | QtScheduler | 你的应用是一个 Qt 应用,需使用QTimer完成定时唤醒。 | |
2/4 | triggers(触发器) | 描述调度任务被触发的条件。 | 不过触发器完全是无状态的。 |
2.1 | date | 时间 | |
2.1.1 | run_date (datetime 或 str)作业的运行日期或时间 | ||
2.1.2 | timezone (datetime.tzinfo 或 str)指定时区 | ||
下方有示例 | |||
2.2 | interval | 定时 | |
2.2.1 | weeks (int)间隔几周 | ||
2.2.2 | days (int)间隔几天 | ||
2.2.3 | hours (int)间隔几小时 | ||
2.2.4 | minutes (int)间隔几分钟 | ||
2.2.5 | seconds (int)间隔多少秒 | ||
2.2.6 | start_date (datetime 或 str)开始日期 | ||
2.2.7 | end_date (datetime 或 str)结束日期 | ||
2.2.8 | timezone (datetime.tzinfo 或str)时区 | ||
2.3 | cron | 定时 | |
2.3.1 | year (int 或 str)年,4位数字 | ||
2.3.2 | month (int 或 str)月 (范围1-12) | ||
2.3.3 | day (int 或 str)日 (范围1-31 | ||
2.3.4 | week (int 或 str)周 (范围1-53) | ||
2.3.5 | day_of_week (int 或 str)周内第几天或者星期几 (范围0-6 或者 mon,tue,wed,thu,fri,sat,sun) | ||
2.3.6 | hour (int 或 str)时 (范围0-23) | ||
2.3.7 | minute (int 或 str)分 (范围0-59) | ||
2.3.8 | second (int 或 str)秒 (范围0-59) | ||
2.3.9 | start_date (datetime 或 str)最早开始日期(包含) | ||
2.3.10 | end_date (datetime 或 str)最晚结束时间(包含) | ||
2.3.11 | timezone (datetime.tzinfo 或str)指定时区 | ||
3/4 | job stores(作业存储器) | 任务持久化仓库 | 默认保存任务在内存中,也可将任务保存到各种数据库中。 |
4/4 | executors(执行器) | 负责处理作业的运行 | 它们通常通过在作业中提交指定的可调用对象到一个线程或者进城池来进行。当作业完成时,执行器将会通知调度器。 |
## 在 2017-12-13 时刻运行一次 job_func 方法
scheduler .add_job(job_func, 'date', run_date=date(2017, 12, 13), args=['text'])
## 在 2017-12-13 14:00:00 时刻运行一次 job_func 方法
scheduler .add_job(job_func, 'date', run_date=datetime(2017, 12, 13, 14, 0, 0), args=['text'])
## 在 2020-12-13 14:00:01 时刻运行一次 job_func 方法
scheduler.add_job(job3,"date",run_date='2020-12-13 14:00:01',args=['王飞'],id="job3")
## 如果date后面没有参数的话,就是立刻执行代码,一般测试的时候用
app.scheduler.add_job(函数名, "date", args=[app])