功能介绍
schedulers 调度器主要分三种,一种独立运行的,一种是后台运行的,最后一种是配合其它程序使用 BlockingScheduler: 当这个调度器是你应用中 唯一要运行 的东西时使用
BackgroundScheduler: 当 不运行其它框架 的时候使用,并使你的任务在后台运行
AsyncIOScheduler: 当你的程序是 异步IO模型 的时候使用
我的项目用到的是BlockingScheduler,所以这里只记录了BlockingScheduler的使用和参数解释。
使用实践
import time
from apscheduler.schedulers.blocking import BlockingScheduler
scheduler = BlockingScheduler()
def task1(x):
print(f'task1执行{x}', time.strftime('%Y-%m-%d %H:%M:%S',time.localtime()))
scheduler.add_job(
task1, 'interval', seconds=10, args=['xxx'], id='task1', replace_existing=True
)
def task2(y):
print(f'task2执行{y}', time.strftime('%Y-%m-%d %H:%M:%S',time.localtime()))
scheduler.add_job(
task2, 'cron', second='*/5', args=['yyy'], id='task2', replace_existing=True
)
scheduler.start()
while True:
print('如果被阻塞,这一段不会执行')
time.sleep(1)
task1:每隔10s执行一次
task2:每5s执行一次,相当于interval 间隔调度中seconds = 5
输出结果
可以看到结果中task1每10秒执行一次,task2每5秒执行一次。
参数解释
add.jobs()方法的参数解释
- task1:要执行的方法名
- ‘interval’,‘cron’,‘date’:任务执行模式规则
interval:每隔一定的时间进行调度任务。
'interval', seconds=10:#每间隔10s执行一次
'interval', minutes=10:#每间隔10s执行一次
'interval', hours=10:#每间隔10s执行一次
'interval'#不支持设置天和月的单位
'interval', hours=2, start_date='2024-01-10 09:30:00', end_date='2024-06-15 11:00:00'#从开始时间到结束时间,每隔俩小时运行一次
date:在设定的时间调度任务,但是只能执行一次。
"date",run_date="2021-11-29 21:16:00") 在设定的时间执行,只执行一次
cron:在设定的时间调度任务。
"cron", day_of_week="0-4", hour=6, minute=30:#周一到周五每天6:30执行
'cron', hour=6, minute=30,second=10:#每天6:30:10执行一次
'cron', hour ='6', minute ='30',second='10' :#等价于上面,这里可以填写数字,也可以填写字符串
'cron',hour ='19-21', minute= '23' #表示 19:23、 20:23、 21:23 各执行一次任务
'cron', month='1,3,5,7-9', day='*', hour='14', minute='*'#在1月,3月,5月,7-9月,每天的下午2点,每一分钟执行一次任务
'cron', month='6-8,11-12', day='3rd fri', hour='0-3'#会在 6、7、8、11、12 月的第三个周五的 0、1、2、3 点执行
- 定时任务传参
使用 args=[参数1] 或 kwargs={“参数名1”: “参数1”} 传参 - 避免已有作业重新添加到数据库
replace_existing=True:数据库已有任务的话,重新启动程序不会报错,设置为False或者不设置会报错。
Scheduler 任务操作方法
- 添加任务—add_job
scheduler.add_job(job_obj,args,id,trigger,**trigger_kwargs)
- 删除任务—remove_job
scheduler.remove_job(job_id,jobstore=None)
- 暂停任务—pause_job
scheduler.pause_job(job_id,jobstore=None)
- 恢复任务—resume_job
scheduler.resume_job(job_id,jobstore=None)
5.修改某个任务属性信息—modify_job
scheduler.modify_job(job_id,jobstore=None,**changes)
- 修改单个作业的触发器并更新下次运行时间—reschedule_job
scheduler.reschedule_job(job_id,jobstore=None,trigger=None,**trigger_args)
7.输出作业信息—print_jobs
scheduler.print_jobs(jobstore=None,out=sys.stdout)
Scheduler 事件监听(add_listener)
import time
from apscheduler.schedulers.blocking import BlockingScheduler
from apscheduler.events import EVENT_JOB_EXECUTED, EVENT_JOB_ERROR
scheduler = BlockingScheduler()
def task1(x):
print(f'task1执行{x}', time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()))
def task2(y):
print(f'task2执行{y}', time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()))
def jib_listener(event):
if event.exception:
print('任务出错')
else:
print('任务正常运行')
if __name__ == '__main__':
scheduler.add_job(
task1, 'interval', seconds=10, args=['xxx'], id='task1', replace_existing=True)
scheduler.add_job(
task2, 'cron', second='*/5', args=['yyy'], id='task2', replace_existing=True)
scheduler.add_listener(jib_listener, EVENT_JOB_EXECUTED | EVENT_JOB_ERROR)
scheduler.start()
使用到的事件状态,需要导入
from apscheduler.events import EVENT_JOB_EXECUTED, EVENT_JOB_ERROR
运行结果:因为没有添加异常的方法,所以只有正常运行的监听,也可以添加失败的方式测试一下。