系统环境

Windows10
python3.7

框架安装

pip install apscheduler

基本组件

APScheduler 有四种组件,分别是:调度器(scheduler),作业存储(job store),触发器(trigger),执行器(executor)。


1、schedulers(调度器) 它是任务调度器,属于控制器角色。它配置作业存储器和执行器可以在调度器中完成,例如添加、修改和移除作业。 2、triggers(触发器) 描述调度任务被触发的条件。不过触发器完全是无状态的。 3、job stores(作业存储器) 任务持久化仓库,默认保存任务在内存中,也可将任务保存都各种数据库中,任务中的数据序列化后保存到持久化数据库,从数据库加载后又反序列化。 4、executors(执行器) 负责处理作业的运行,它们通常通过在作业中提交指定的可调用对象到一个线程或者进城池来进行。当作业完成时,执行器将会通知调度器。


框架使用

1、定时、循环、一次性任务

import datetime
from apscheduler.schedulers.blocking import BlockingScheduler

def task_1(x):
    print('循环任务1', x, datetime.datetime.now())

scheduler = BlockingScheduler()
# 5秒整倍数,就执行这个任务
scheduler.add_job(func=task_1, args=('定时任务',), trigger='cron', second='*/5')
scheduler.add_job(func=task_1, args=('一次性任务',), next_run_time=datetime.datetime.now() + datetime.timedelta(seconds=12))
scheduler.add_job(func=task_1, args=('循环任务',), trigger='interval', seconds=3)
scheduler.start()

2、简单循环任务

from apscheduler.schedulers.blocking import BlockingScheduler
import datetime

def task_1():
    print('循环任务1', datetime.datetime.now())

scheduler = BlockingScheduler()
# 每2秒钟,无限循环执行任务
scheduler.add_job(func=task_1, trigger='interval', seconds=2)
scheduler.start()

3、简单定时任务

import datetime
from apscheduler.schedulers.blocking import BlockingScheduler

def task_1():
    print('循环任务1', datetime.datetime.now())

scheduler = BlockingScheduler()
# 5秒整倍数,就执行这个任务
scheduler.add_job(func=task_1, trigger='cron', second='*/5')
scheduler.start()

4、复杂定时任务

import datetime
from apscheduler.schedulers.blocking import BlockingScheduler

def task_1():
    print('循环任务1', datetime.datetime.now())

scheduler = BlockingScheduler()
# 在每年 1-3、11 月份中的每个星期一、五中的 11-12点之间,秒数是5的倍数时执行 task_1 任务
scheduler .add_job(func=task_1, trigger='cron', month='1-3,11', day_of_week='0,fri', hour='11-12', second='*/5')
scheduler.start()

5、带参定时任务

import datetime
from apscheduler.schedulers.blocking import BlockingScheduler

def task_1(x):
    print('循环任务1', x, datetime.datetime.now())

scheduler = BlockingScheduler()
# 5秒整倍数,就执行这个任务
scheduler.add_job(func=task_1, args=('你好',), trigger='cron', second='*/5')
scheduler.start()

6、带日志任务

import datetime
import logging
from apscheduler.schedulers.blocking import BlockingScheduler

logging.basicConfig(level=logging.ERROR,  # 设置捕获错误等级
                    format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
                    datefmt='%Y-%m-%d %H:%M:%S',
                    filename='log1.txt',  # 日志存放位置
                    filemode='a')

def task_1(x):
    print(1/0)   # 故意引发报错
    print('循环任务1', x, datetime.datetime.now())

scheduler = BlockingScheduler()
scheduler.add_job(func=task_1, args=('循环任务',), trigger='interval', seconds=3)
# 加入日志
scheduler._logger = logging
scheduler.start()

7、删除任务

import datetime
from apscheduler.schedulers.blocking import BlockingScheduler

def task_1(x):
    print(x, datetime.datetime.now())

def task_remove(task_id):
    scheduler.remove_job(task_id)  # 通过任务id删除任务
    print('删除任务', task_id, datetime.datetime.now())

scheduler = BlockingScheduler()
scheduler.add_job(func=task_1, args=('定时任务',), trigger='cron', second='*/5', id='cron_task')
# 执行删除任务
scheduler.add_job(func=task_remove, args=('cron_task',), next_run_time=datetime.datetime.now() + datetime.timedelta(seconds=12), id='date_task')
scheduler.add_job(func=task_1, args=('循环任务',), trigger='interval', seconds=3, id='interval_task')
scheduler.start()

8、停止、恢复任务

import datetime
from apscheduler.schedulers.blocking import BlockingScheduler

def task_1(x):
    print(x, datetime.datetime.now())

# 暂停任务
def task_pause(task_id):
    scheduler.pause_job(task_id)
    print('暂停任务', task_id, datetime.datetime.now())

# 恢复任务
def task_resume(task_id):
    scheduler.resume_job(task_id)
    print('恢复任务', task_id, datetime.datetime.now())

scheduler = BlockingScheduler()
scheduler.add_job(func=task_1, args=('定时任务',), trigger='cron', second='*/5', id='cron_task')
# 执行暂停任务
scheduler.add_job(func=task_pause, args=('cron_task',), next_run_time=datetime.datetime.now() + datetime.timedelta(seconds=12), id='date_pause')
# 执行恢复任务
scheduler.add_job(func=task_resume, args=('cron_task',), next_run_time=datetime.datetime.now() + datetime.timedelta(seconds=24), id='date_resume')
scheduler.add_job(func=task_1, args=('循环任务',), trigger='interval', seconds=3, id='interval_task')
scheduler.start()

9、任务监听

import datetime
from apscheduler.events import EVENT_JOB_EXECUTED, EVENT_JOB_ERROR
from apscheduler.schedulers.blocking import BlockingScheduler

def task_1():
    print(1/0)   # 故意引发报错
    print('循环任务1', datetime.datetime.now())

def task_2():
    print('循环任务2', datetime.datetime.now())

def my_listener(event):
     if event.exception:
         print('有任务出错了!')

scheduler = BlockingScheduler()
scheduler.add_job(func=task_1, trigger='interval', seconds=3)
scheduler.add_job(func=task_2, trigger='interval', seconds=3)
scheduler.add_listener(my_listener, EVENT_JOB_EXECUTED | EVENT_JOB_ERROR)
scheduler.start()