Python任务调度模块APScheduler

目录

  • 一、APScheduler 是什么&APScheduler四种组成部分?

    • 1、调度器(scheduler)
    • 2、作业存储(job store)
    • 3、执行器(executor)
    • 4、触发器(triggers)
      • 4.1、date 定时调度(作业只会执行一次)
      • 4.2、interval: 每隔一段时间执行一次
      • 4.3、cron: 使用同linux下crontab的方式
  • 二、 How:APSched 怎么用?
    • 安装
    • 快速上手
    • 任务操作
      • 1、添加任务
      • 2、删除任务
      • 3、暂停&继续任务
      • 4、修改任务属性
      • 5、获得job列表
      • 6、开始&关闭任务
  • 三、一些定时任务脚本
    • 1、定时任务运行脚本每日凌晨00:30:30执行
    • 2、每天晚上0点 - 早上8点期间,每5秒执行一次任务。
    • 3、在0、10、20、30、40、50分时执行任务。
    • 4、直到2020-05-30,每周从周一到周五的早上5:30都执行一次定时任务
    • 5、在6,7,8,11,12月的第3个周五的1,2,3点执行定时任务
    • 6、每5秒执行该程序一次
  • 参考资料

一、APScheduler 是什么&APScheduler四种组成部分?

APScheduler全程为Advanced Python Scheduler,是一款轻量级的Python任务调度框架。它允许你像Cron那样安排定期执行的任务,并且支持Python函数或任意可调用的对象。

1、调度器(scheduler)

调度器(scheduler)是其他的组成部分。你通常在应用只有一个调度器,应用的开发者通常不会直接处理作业存储、调度器和触发器,相反,调度器提供了处理这些的合适的接口。配置作业存储和执行器可以在调度器中完成,例如添加、修改和移除作业。 

对于不同的不场景,可以选择的调度器:

  • BlockingScheduler : 当调度器是你应用中唯一要运行的东西时。
  • ==BackgroundScheduler== : 当你没有运行任何其他框架并希望调度器在你应用的后台执行时使用(常用)。
  • AsyncIOScheduler : 当你的程序使用了asyncio(一个异步框架)的时候使用。
  • GeventScheduler : 当你的程序使用了gevent(高性能的Python并发框架)的时候使用。
  • TornadoScheduler : 当你的程序基于Tornado(一个web框架)的时候使用。
  • TwistedScheduler : 当你的程序使用了Twisted(一个异步框架)的时候使用
  • QtScheduler : 如果你的应用是一个Qt应用的时候可以使用。
# BackgroundScheduler: 调度器在后台线程中运行,不会阻塞当前线程。

from apscheduler.schedulers.background import BackgroundScheduler
import time

scheduler = BackgroundScheduler()

def job1():
    print "%s: 执行任务"  % time.asctime()

scheduler.add_job(job1, 'interval', seconds=3)
scheduler.start()

while True:
    pass

2、作业存储(job store)

作业存储(job store)主要用来存储被调度的作业,默认的作业存储是简单地把作业保存在内存中。

jobstore提供对scheduler中job的增删改查接口,根据存储方式的不同,分以下几种:

  • MemoryJobStore:没有序列化,jobs就存在内存里,增删改查也都是在内存中操作
  • SQLAlchemyJobStore:所有sqlalchemy支持的数据库都可以做为backend,增删改查操作转化为对应backend的sql语句
  • MongoDBJobStore:用mongodb作backend
  • RedisJobStore:?用redis作backend
  • RethinkDBJobStore:?用rethinkdb?作backend
  • ZooKeeperJobStore:用ZooKeeper做backend

3、执行器(executor)

执行器(executor)主要处理任务的运行,主要是把定时任务中的可调用对象(function)提交给一个一个线程或者进程来进行。当任务完成时,执行器将会通知调度器。

最常用的 执行器(executor) 有两种:

  • ProcessPoolExecutor(进程池)
  • ThreadPoolExecutor(线程池,max:10)

4、触发器(triggers)

当调度一个任务时,需要为它设置一个触发器(triggers)。触发器决定在什么日期/时间、用什么样的形式来执行执行这个定时任务。

APScheduler 有三种内建的 trigger:

  • date: 指定某个确定的时间点,job仅执行一次。
  • interval: 指定时间间隔(fixed intervals)周期性执行。
  • cron: 使用cron风格表达式周期性执行,用于(在指定时间内)定期运行job的场景。使用同linux下crontab的方式。

4.1、date 定时调度(作业只会执行一次)

参数如下:

  • run_date (datetime|str) – 作业的运行日期或时间
  • timezone (datetime.tzinfo|str) – 指定时区
<!--# 2016-12-12运行一次job_function-->
sched.add_job(job_function, 'date', run_date=date(2016, 12, 12), args=['text'])

<!--# 2016-12-12 12:00:00运行一次job_function-->
<!--args=[]中是传给job_function的参数-->
sched.add_job(job_function, 'date', run_date=datetime(2016, 12, 12, 12, 0, 0), args=['text'])

4.2、interval: 每隔一段时间执行一次

weeks=0 | days=0 | hours=0 | minutes=0 | seconds=0, start_date=None, end_date=None, timezone=None

  • weeks (int) – 间隔几周
  • days (int) – 间隔几天
  • hours (int) – 间隔几小时
  • minutes (int) – 间隔几分钟
  • seconds (int) – 间隔多少秒
  • start_date (datetime|str) – 开始日期
  • end_date (datetime|str) – 结束日期
  • timezone (datetime.tzinfo|str) – 时区
<!--每隔2小时执行一次-->
scheduler.add_job(my_job, 'interval', hours=2)

<!--设置时间范围,在设置的时间范围内每隔2小时执行一次-->
scheduler.add_job(my_job, 'interval', hours=2, start_date='2017-9-8 21:30:00', end_date='2018-06-15 21:30:00)

<!--使用装饰器的方式添加定时任务-->
@scheduler.scheduled_job('interval', id='my_job_id', hours=2)
def my_job():
    print("Hello World")

4.3、cron: 使用同linux下crontab的方式

(year=None, month=None, day=None, week=None, day_of_week=None, hour=None, minute=None, second=None, start_date=None, end_date=None, timezone=None)

除了week和 day_of_week,它们的默认值是 *

  • 例如 day=1, minute=20 ,这就等于
year='*', month='*', day=1, week='*', day_of_week='*', hour='*', minute=20, second=0

工作将在每个月的第一天以每小时20分钟的时间执行

表达式 参数类型 描述
* 所有 通配符。例: minutes=* 即每分钟触发
*/a 所有 可被a整除的通配符。
a-b 所有 范围a-b触发
a-b/c 所有 范围a-b,且可被c整除时触发
xth y 第几个星期几触发。x为第几个,y为星期几
last x 一个月中,最后个星期几触发
last 一个月最后一天触发
x,y,z 所有 组合表达式,可以组合确定值或上方的表达式
  • 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) – 指定时区
sched.add_job(my_job, 'cron', hour=3, minute=30)
sched.add_job(my_job, 'cron', day_of_week='mon-fri', hour=5, minute=30, end_date='2017-10-30')

@sched.scheduled_job('cron', id='my_job_id', day='last sun')
def some_decorated_task():
    print("I am printed at 00:00:00 on the last Sunday of every month!")

二、 How:APSched 怎么用?

安装

  • pip 安装
pip install apscheduler
  • 源码安装(https://pypi.python.org/pypi/APScheduler/)
python setup.py install

快速上手

# first.py

from apscheduler.schedulers.blocking import BlockingScheduler
import time

# 实例化一个调度器
scheduler = BlockingScheduler()

def job1():
    print "%s: 执行任务"  % time.asctime()

# 添加任务并设置触发方式为3s一次
scheduler.add_job(job1, 'interval', seconds=3)

# 开始运行调度器
scheduler.start()
  • 执行输出:
> python first.py

Fri Sep  8 20:41:55 2017: 执行任务
Fri Sep  8 20:41:58 2017: 执行任务
...

任务操作

1、添加任务

方法一:调用add_job()方法

调用add_job()方法返回一个apscheduler.job.Job 的实例,可以用来改变或者移除 job

job = scheduler.add_job(myfunc, 'interval', minutes=2)

方法二:使用装饰器scheduled_job()

适用于应用运行期间不会改变的 job

from apscheduler.schedulers.blocking import BlockingScheduler
sched = BlockingScheduler()
# 装饰器
@sched.scheduled_job('interval', id='my_job_id', seconds=5)
def job_function():
    print("Hello World")
# 开始
sched.start()

2、删除任务

 <!--方法一:通过作业ID或别名调用remove_job()删除作业-->
scheduler.add_job(myfunc, 'interval', minutes=2, id='my_job_id')
scheduler.remove_job('my_job_id')

<!-- 方法二:通过add_job()返回的job实例调用remove()方法删除作业-->
job = scheduler.add_job(myfunc, 'interval', minutes=2)
job.remove()

3、暂停&继续任务

可以通过Job实例或调度程序本身轻松暂停和恢复作业。 当作业暂停时,下一个运行时间将被清除,直到作业恢复,不会再计算运行时间。 要暂停作业,请使用以下任一方法:

<!--根据任务实例-->
job = scheduler.add_job(myfunc, 'interval', minutes=2)
<!--暂停-->
job.pause()
<!--继续-->
job.resume() 

 <!--根据任务id暂停-->
scheduler.add_job(myfunc, 'interval', minutes=2, id='my_job_id')
scheduler.pause_job('my_job_id')
scheduler.resume_job('my_job_id')

4、修改任务属性

<!--修饰:-->
job.modify(max_instances=6, name='Alternate name')

<!--重设:-->
scheduler.reschedule_job('my_job_id', trigger='cron', minute='*/5')

5、获得job列表

  • 使用get_jobs()来获取所有的job实例。
  • 使用print_jobs()来输出所有格式化的作业列表。
  • 使用get_job(任务ID)获取指定任务的作业列表。
<!--获取所有的job实例-->
apscheduler.get_jobs()

6、开始&关闭任务


scheduler.start() #开启
scheduler.shotdown(wait=True|False) #关闭 False 无论任务是否执行,强制关闭

三、一些定时任务脚本

1、定时任务运行脚本每日凌晨00:30:30执行

import datetime
from apscheduler.schedulers.blocking import BlockingScheduler
from app.untils.log_builder import sys_logging

scheduler = BlockingScheduler()   # 后台运行

 # 设置为每日凌晨00:30:30时执行一次调度程序
@scheduler.scheduled_job("cron", day_of_week='*', hour='1', minute='30', second='30')
def rebate():
        print "schedule execute"
        sys_logging.debug("statistic scheduler execute success" + datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"))

if __name__ == '__main__':
    try:
        scheduler.start()
        sys_logging.debug("statistic scheduler start success")
    except (KeyboardInterrupt, SystemExit):
        scheduler.shutdown()
        sys_logging.debug("statistic scheduler start-up fail")

2、每天晚上0点 - 早上8点期间,每5秒执行一次任务。

# 每天晚上0点 - 早上8点期间,每5秒执行一次任务。
scheduler.add_job(my_job, 'cron',day_of_week='*',hour = '0-8',second = '*/5')

3、在0、10、20、30、40、50分时执行任务。

<!--# 可以被10整除的时间点执行任务,这个任务就表示在0、10、20、30、40、50分时都会执行任务-->
scheduler.add_job(my_job, 'cron',day_of_week='*',minute = '*/10')

4、直到2020-05-30,每周从周一到周五的早上5:30都执行一次定时任务

<!--直到2020-05-30 00:00:00,每周星期从星期一到星期五的早上5:30都执行一次定时任务-->
sched.add_job(my_job(),'cron', day_of_week='mon-fri', hour=5, minute=30,end_date='2020-05-30')

<!--# 截止到2016-12-30 00:00:00,每周一到周五早上五点半运行job_function-->
sched.add_job(job_function, 'cron', day_of_week='mon-fri', hour=5, minute=30, end_date='2016-12-31')

5、在6,7,8,11,12月的第3个周五的1,2,3点执行定时任务

<!--job_function将会在6,7,8,11,12月的第3个周五的1,2,3点运行-->

sched.add_job(job_function, 'cron', month='6-8,11-12', day='3rd fri', hour='0-3')

6、每5秒执行该程序一次

<!--#表示每5秒执行该程序一次,相当于interval 间隔调度中seconds = 5-->
sched.add_job(my_job,?'cron',second?=?'*/5')

参考资料

  • Python任务调度模块APScheduler:https://segmentfault.com/a/1190000011084828
  • 官方文档:https://apscheduler.readthedocs.io/en/v3.3.0/modules/schedulers/base.html#apscheduler.schedulers.base.BaseScheduler.print_jobs
  • API文档:https://apscheduler.readthedocs.io/en/v3.3.0/py-modindex.html
  • python模块(APScheduler定时任务):https://blog.csdn.net/qq_37634812/article/details/79208782
  • Python定时任务APScheduler的实例实例详解:https://www.jb51.net/article/165895.htm

原文地址:https://www.cnblogs.com/jasontang369/p/12178774.html

时间: 2024-10-24 22:25:40

Python任务调度模块APScheduler的相关文章

Python任务调度模块 – APScheduler(摘抄)

Python任务调度模块 – APScheduler 2015年6月11日 by debugo · 32 Comments APScheduler是一个Python定时任务框架,使用起来十分方便.提供了基于日期.固定时间间隔以及crontab类型的任务,并且可以持久化任务.并以daemon方式运行应用.目前最新版本为3.0.x.在APScheduler中有四个组件:触发器(trigger)包含调度逻辑,每一个作业有它自己的触发器,用于决定接下来哪一个作业会运行.除了他们自己初始配置意外,触发器完

Python任务调度模块 – APScheduler

APScheduler是一个Python定时任务框架,使用起来十分方便.提供了基于日期.固定时间间隔以及crontab类型的任务,并且可以持久化任务.并以daemon方式运行应用.目前最新版本为3.0.x. 在APScheduler中有四个组件: 触发器(trigger)包含调度逻辑,每一个作业有它自己的触发器,用于决定接下来哪一个作业会运行.除了他们自己初始配置意外,触发器完全是无状态的. 作业存储(job store)存储被调度的作业,默认的作业存储是简单地把作业保存在内存中,其他的作业存储

[转]Python定时任务框架APScheduler

APScheduler是基于Quartz的 一个Python定时任务框架,实现了Quartz的所有功能,使用起来十分方便.提供了基于日期.固定时间间隔以及crontab类型的任务,并且可以 持久化任务.基于这些功能,我们可以很方便的实现一个python定时任务系统,写python还是要比java舒服多了. 1. 安装 安装过程很简单,可以基于easy_install和源码. easy_install apscheduler 或者下载源码,运行命令: python setup.py install

python任务调度模块celery

python任务调度模块celerycelery简介Celery特点Celery工作流程图celery安装使用 python任务调度模块celery celery简介 Celery是一个python开发的异步分布式任务调度模块.Celery本身并不提供消息服务,使用第三方服务,也就是borker来传递任务,一般使用rabbitMQ或者Redis. Celery特点 简单:一单熟悉了celery的工作流程后,配置和使用还是比较简单的. 高可用:当任务执行失败或执行过程中发生连接中断,celery

Python定时任务框架APScheduler 3.0.3 Cron示例

APScheduler是基于Quartz的一个Python定时任务框架,实现了Quartz的所有功能,使用起来十分方便.提供了基于日期.固定时间间隔以及crontab类型的任务,并且可以持久化任务.基于这些功能,我们可以很方便的实现一个python定时任务系统. 安装 安装过程很简单,可以基于pip和源码. Pip install apscheduler==3.0.3 或者下载源码,运行命令: Python setup.py install cron job例子 1: #coding=utf-8

python中的apscheduler模块

1.简介 apscheduler是python中的任务定时模块,它包含四个组件:触发器(trigger),作业存储(job store),执行器(executor),调度器(scheduler). 2.安装 pip install apscheduler 3.示例 1 # coding=utf-8 2 from apscheduler.schedulers.blocking import BlockingScheduler 3 4 #作业1 5 def my_job1(): 6 print 'h

python 定时任务 from apscheduler.schedulers.blocking import BlockingScheduler

说明:使用python内置的模块来实现,本篇博客只是以循环定时来示范,其他的可以结合crontab的风格自己设定 一.导包 from apscheduler.schedulers.blocking import BlockingScheduler二.普通函数的使用 (1)interval模式,功能比较单一 sched = BlockingScheduler()@sched.scheduled_job('interval',seconds=5)def crawl_job(): #五秒执行一次 pr

django定时任务python调度框架APScheduler使用详解

# coding=utf-8 2 """ 3 Demonstrates how to use the background scheduler to schedule a job that executes on 3 second 4 intervals. 5 """ 6 7 from datetime import datetime 8 import time 9 import os 10 11 from apscheduler.schedul

python调度框架APScheduler使用详解

# coding=utf-8 2 """ 3 Demonstrates how to use the background scheduler to schedule a job that executes on 3 second 4 intervals. 5 """ 6 7 from datetime import datetime 8 import time 9 import os 10 11 from apscheduler.schedul