Apscheduler 介绍

核心组件: 调度器、作业存储、执行器、触发器

调度器

BlockingScheduler

        阻塞的调度器,适用于脚本

BackgroundScheduler

        后台调度器,适用于非阻塞的应用如Web应用

AsyncIOScheduler

        适用于 asyncio 的调度器


GeventScheduler

         适用于 Gevent 的调度器


TornadoScheduler

        适用于 Tornado 的调度器


TwistedScheduler

        适用于 Twisted 的调度器。

作业存储

        保存作业的地方,默认是使用 内存存储,也可以持久化到数据库,支持redis、mongdb等

执行器

        执行作业的工具,默认是ThreadPoolExecutor和ProcessPoolExecutor,也就是线程池和进程池

触发器

        确定何时运行作业,主要有三种:date、interval、cron

date

        在特定时间点运行一次,也就只运行一次

interval

        按指定间隔运行,例如每五秒运行

cron

        可支持复杂的规格,例如每天某个时间点执行,每周一执行等

        更多详细介绍请转到官网

基本用法

1.创建调度器

from apscheduler.schedulers.background import BackgroundScheduler


scheduler = BackgroundScheduler()

 

2.具体的定时任务方法

def job_function(**kwargs):
    print(kwargs.get("name", "没有传递名称"))
    print(f"定时任务执行了:{kwargs.get('执行时间', datetime.now())}")

3.设置触发器

# scheduler.add_job(job_function, 'date', kwargs={"name": "张三", }, **{"run_date": datetime.now() + timedelta(seconds=1)})

scheduler.add_job(job_function, 'interval', seconds=2)

# scheduler.add_job(job_function, 'cron', **{"start_date": "2024-06-18 10:38:00", "end_date": "2024-06-18 10:38:20", "second": "*/2"})

 

4.运行定时任务

scheduler.start()

整体代码

from datetime import datetime
from apscheduler.schedulers.background import BackgroundScheduler


def job_function(**kwargs):
    print(kwargs.get("name", "没有传递名称"))
    print(f"定时任务执行了:{kwargs.get('执行时间', datetime.now())}")


scheduler = BackgroundScheduler()
# scheduler.add_job(job_function, 'date', kwargs={"name": "张三", }, **{"run_date": datetime.now() + timedelta(seconds=1)})

# scheduler.add_job(job_function, 'interval', seconds=2)

# scheduler.add_job(job_function, 'cron', **{"start_date": "2024-06-18 10:38:00", "end_date": "2024-06-18 10:38:20", "second": "*/2"})

scheduler.add_job(job_function, 'cron', )
# scheduler.add_job(job_function, 'cron', **{"start_date": "2024-06-18 10:38:00", "end_date": "2024-06-18 10:38:20", "second": "*/2"})


scheduler.start()

while True:
    pass

触发器常用规则

可以使用对应的trigger对象进行建立对应的规则,也可以直接用简写方式

trigger对象

from apscheduler.triggers.date import DateTrigger

from apscheduler.triggers.interval import IntervalTrigger

from apscheduler.triggers.cron import CronTrigger

因为这些写法相对繁琐,博主更推荐用简写方式,所以就不详解展开介绍对象写法,就简单给出几个例子

sched.add_job(job_function, trigger=DateTrigger(run_date=datetime(2023, 10, 1, 10, 30)))

sched.add_job(job_function, trigger=IntervalTrigger(hours=2))

sched.add_job(job_function, trigger=CronTrigger(day_of_week='mon', hour='8,12', minute='30'))

add_job 可接收的参数

func, trigger=None, args=None, kwargs=None, id=None, name=None,
                misfire_grace_time=undefined, coalesce=undefined, max_instances=undefined,
                next_run_time=undefined, jobstore='default', executor='default',
                replace_existing=False, **trigger_args

func 要运行的函数对象,注意是函数对象,不是函数名

args和kwargs是传递给需要执行函数的参数

**trigger_args 才是给触发器设置规则的参数

date 支持的规则

可以传入一个时间对象,或者是满足时间格式的字符串

时间对象:datetime.now()

scheduler.add_job(job_function, 'date', kwargs={"name": "张三",}, **{"run_date": datetime.now() + timedelta(seconds=1)})

效果:在当前时间再加一秒后执行

字符串:2024-06-18 10:02:00
scheduler.add_job(job_function, 'date', kwargs={"name": "张三",}, **{"run_date": "2024-06-18 10:02:00"})

效果:在2024-06-18 10:02:00执行

interval 支持的规则

weeks (int)  –  间隔几周 
days (int)  –  间隔几天 
hours (int)  –  间隔几小时 
minutes (int)  –  间隔几分钟 
seconds (int)  –  间隔多少秒 
start_date (datetime|str)  –  开始日期 
end_date (datetime|str)  –  结束日期 
timezone (datetime.tzinfo|str)  –  时区 

间隔*秒后执行

scheduler.add_job(job_function, 'interval', seconds=2)

效果:每两秒执行一次

cron 支持的规则

(int|str) 表示参数既可以是int类型,也可以是str类型
(datetime | str) 表示参数既可以是datetime类型,也可以是str类型
year (int|str) – 4-digit year -(表示四位数的年份,如2008年)
month (int|str) – month (1-12) -(表示取值范围为1-12月)
day (int|str) – day of the (1-31) -(表示取值范围为1-31日)
week (int|str) – ISO week (1-53) -(格里历2006年12月31日可以写成2006年-W52-7(扩展形式)或2006W527(紧凑形式))
day_of_week (int|str) – number or name of weekday (0-6 or mon,tue,wed,thu,fri,sat,sun) - (表示一周中的第几天,既可以用0-6表示也可以用其英语缩写表示)
hour (int|str) – hour (0-23) - (表示取值范围为0-23时)
minute (int|str) – minute (0-59) - (表示取值范围为0-59分)
second (int|str) – second (0-59) - (表示取值范围为0-59秒)
start_date (datetime|str) – earliest possible date/time to trigger on (inclusive) - (表示开始时间)
end_date (datetime|str) – latest possible date/time to trigger on (inclusive) - (表示结束时间)
timezone (datetime.tzinfo|str) – time zone to use for the date/time calculations (defaults to scheduler timezone) -(表示时区取值)

每周几执行

可以填写 0-6 或者 mon,tue.wed,thu,fri,sat,sun 

scheduler.add_job(job_function, 'cron',**{"day_of_week": "mon"})  

效果:每周一执行

每天固定时间执行

scheduler.add_job(job_function, 'cron',**{ hour='8, 12', minute='30'})

效果:每天早上8点30分和中午12点和30分运执行

每天时间范围内执行

scheduler.add_job(job_function, 'cron', **{"start_date": "2024-06-18 10:38:00", "end_date": "2024-06-18 10:38:20", "second": "*/2"})

效果:每天 2024-06-18 10:38:00 开始执行至2024-06-18 10:38:20 且每2秒执行一次

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部