python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python APScheduler 定时任务

最新Python APScheduler 定时任务详解

作者:爱吃辣椒的锅包肉

这篇文章主要介绍了Python使用apscheduler模块设置定时任务,APScheduler全称Advanced Python Scheduler 作用为在指定的时间规则执行指定的作业,本文对Python APScheduler 定时任务相关知识介绍的非常详细,需要的朋友参考下

一、基本概念

APScheduler全称Advanced Python Scheduler 作用为在指定的时间规则执行指定的作业。

1.1、 触发器:triggers

用于设定触发任务的条件: 触发器包含调度逻辑。每个任务都有自己的触发器,用于确定何时应该运行作业。除了初始配置之外,触发器完全是无状态的

1.2、作业存储器:job stores

用于存放任务,把任务存放在内存或数据库中

1.3、执行器 executors

用于执行任务,可以设定执行模式为单线程或线程池:任务会被执行器放入线程池或进程池去执行,执行完毕后,执行器会通知调度器。

1.4、调度器 schedulers

把上方三个组件作为参数,通过创建调度器实例来运行:一个调度器由上方三个组件构成,一般来说,一个程序只要有一个调度器就可以了。开发者也不必直接操作任务储存器、执行器以及触发器,因为调度器提供了统一的接口,通过调度器就可以操作组件,比如任务的增删改查。

在这里插入图片描述

二、调度器详解

2.1、APScheduler有三种内置的触发器

2.2、触发器公共参数

2.3、date内置触发器

date 是最基本的一种调度,作业任务只会执行一次。它表示特定的时间点触发。它的参数如下:

参数说明
run_date (datetime 或 str)作业的运行日期或时间
timezone (datetime.tzinfo 或 str)指定时区
from datetime import datetime
from datetime import date
from apscheduler.schedulers.blocking import BlockingScheduler
def job(text):
    print(text)
scheduler = BlockingScheduler()
# 在 2019-8-30 运行一次 job 方法
scheduler.add_job(job, 'date', run_date=date(2022, 4, 9), args=['text1'], id="1", coalesce=True, max_instances=1)
# 在 2019-8-30 01:00:00 运行一次 job 方法
scheduler.add_job(job, 'date', run_date=datetime(2022, 4, 9, 17, 40, 58), args=['text2'], id="2", coalesce=True, max_instances=1)
# 在 2019-8-30 01:00:01 运行一次 job 方法
scheduler.add_job(job, 'date', run_date='2022-4-9 17:41:00', args=['text3'], id="3", coalesce=True, max_instances=1)
scheduler.start()

2.4、interval 周期触发任务

参数说明
weeks (int)间隔几周
days (int)间隔几天
hours (int)间隔几小时
minutes (int)间隔几分钟
seconds (int)间隔多少秒
start_date (datetime 或 str)开始日期
end_date (datetime 或 str)结束日期
timezone (datetime.tzinfo 或str)时区
@sched.scheduled_job(
    "interval", id=spider_job_name + "_bg_data", coalesce=True, max_instances=1, minutes=20
)
def tick_rzjg_detail_xq():
    """
    快速完成
    :return:
    """
    each = "rzjg_bg_data"
    cmd_str = f"cd {ROOT} && bash run_spider.sh {each} --loglevel=INFO"
    print(cmd_str)
    os.system(cmd_str)
def func():
    print("Press Ctrl+C to exit")
    # 直接触发一次
    tick_rzjg_detail_xq()
    try:
        sched.start()
    except (KeyboardInterrupt, SystemExit):
        pass

if __name__ == "__main__":
    func()

2.5、cron 触发器 在特定时间周期性地触发,和Linux crontab格式兼容。

它是功能最强大的触发器

参数说明
year (int 或 str) 年,4位数字
month (int 或 str)月 (范围1-12)
day (int 或 str)日 (范围1-31)
week (int 或 str) 周 (范围1-53)
day_of_week (int 或 str) 周内第几天或者星期几 (范围0-6 或者 mon,tue,wed,thu,fri,sat,sun)
hour (int 或 str) 时 (范围0-23)
minute (int 或 str)分 (范围0-59)
second (int 或 str) 秒 (范围0-59)
start_date (datetime 或 str)最早开始日期(包含)
end_date (datetime 或 str)最晚结束时间(包含)
timezone (datetime.tzinfo 或str)指定时区
表达式参数类型描述
*所有通配符。例:minutes=*即每分钟触发
*/a所有可被a整除的通配符
a-b所有范围a-b触发
a-b/c所有范围a-b,且可被c整除时触发
xth y第几个星期几触发。x为第几个,y为星期几
last x一个月中,最后个星期几触发
last一个月最后一天触发
x,y,z所有组合表达式,可以组合确定值或上方的表达式
 import time
    from apscheduler.schedulers.blocking import BlockingScheduler

    def job(text):
        t = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))
        print('{} --- {}'.format(text, t))

    scheduler = BlockingScheduler()
    # 在每天22点,每隔 1分钟 运行一次 job 方法
    scheduler.add_job(job, 'cron', hour=22, minute='*/1', args=['job1'])
    # 在每天22和23点的25分,运行一次 job 方法
    scheduler.add_job(job, 'cron', hour='22-23', minute='25', args=['job2'])
    # 在每天 8 点,运行一次 job 方法
    scheduler.add_job(job, 'cron', hour='8', args=['job2'])
    # 在每天 8 点 20点,各运行一次 job 方法    设置最大运行实例数
    scheduler.add_job(job, 'cron', hour='8, 20', minute=30, max_instances=4)
    scheduler.start()

到此这篇关于Python APScheduler 定时任务详解的文章就介绍到这了,更多相关Python APScheduler 定时任务内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文