ThankNeko's Blog ThankNeko's Blog
首页
  • 操作系统

    • Linux基础
    • Linux服务
    • WindowsServer笔记
    • Ansible笔记
    • Shell笔记
  • 容器服务

    • Docker笔记
    • Kubernetes笔记
    • Git笔记
  • 数据库服务

    • MySQL笔记
    • ELK笔记
    • Redis笔记
  • 监控服务

    • Zabbix笔记
  • Web服务

    • Nginx笔记
    • Tomcat笔记
  • 数据处理

    • Kettle笔记
  • Python笔记
  • Bootstrap笔记
  • C笔记
  • C++笔记
  • Arduino笔记
  • 分类
  • 标签
  • 归档
  • 随笔
  • 关于
GitHub (opens new window)

Hoshinozora

尽人事,听天命。
首页
  • 操作系统

    • Linux基础
    • Linux服务
    • WindowsServer笔记
    • Ansible笔记
    • Shell笔记
  • 容器服务

    • Docker笔记
    • Kubernetes笔记
    • Git笔记
  • 数据库服务

    • MySQL笔记
    • ELK笔记
    • Redis笔记
  • 监控服务

    • Zabbix笔记
  • Web服务

    • Nginx笔记
    • Tomcat笔记
  • 数据处理

    • Kettle笔记
  • Python笔记
  • Bootstrap笔记
  • C笔记
  • C++笔记
  • Arduino笔记
  • 分类
  • 标签
  • 归档
  • 随笔
  • 关于
GitHub (opens new window)
  • Python笔记

    • 基础知识

    • 并发编程

    • 爬虫笔记

    • 模块笔记

      • PyInstaller
      • Jieba
      • Kubernetes
      • Logging
      • Loguru
      • Socket
      • APScheduler
        • 介绍
        • 调度系统
        • 组件
          • 触发器(triggers)
          • 作业存储(job stores)
          • 执行器(executors)
          • 调度器(schedulers)
        • 使用方法
          • 1.安装模块
          • 2.创建调度器
          • 3.添加任务
          • 4.启动Scheduler
          • 5.移除任务
          • 6.获取Job调度列表
          • 7.暂停或恢复Job
          • 8.修改Job
      • PyMySQL
      • Redis
    • 后端笔记

  • C笔记

  • C++笔记

  • Arduino笔记

  • Web笔记

  • Dev
  • Python笔记
  • 模块笔记
Hoshinozora
2024-01-07
目录

APScheduler

# 介绍

APScheduler可根据指定的时间规则执行指定的任务。可以是间隔多久执行,可以是指定日期时间的执行,也可以类似Linux系统中Crontab中的方式执行任务。

指定的任务即Python函数。

# 调度系统

APScheduler一共有三种调度系统。

Linux中cron风格的调度系统,并有可选的开始和结束时间。

基于时间间隔的调度系统,周期性地执行job,并有可选的开始和结束时间。

只执行一次的延后调度系统,只执行一次作业,在设定的时间执行。

# 组件

# 触发器(triggers)

描述调度任务被触发的条件,也就是定时任务的执行的时机。

# 作业存储(job stores)

Job任务默认存储在内存中,但也可以将任务通过序列化存储到各种数据库中。

# 存储在redis中
from apscheduler.jobstores.redis import RedisJobStore

# 存储在数据库中
from apscheduler.jobstores.sqlalchemy import SQLAlchemyJobStore
1
2
3
4
5

# 执行器(executors)

负责处理作业的运行,它们通常会将作业提交到到一个线程池或者进程池中进行。当作业完成时,执行器将会通知调度器,随后由调度器发出一个恰当的事件。

最常用的executor:ProcessPoolExecutor、ThreadPoolExecutor。

# 调度器(schedulers)

调度器提供了处理上述东西的接口,通常一个程序中只有一个调度器。程序开发者一般不会直接处理作业存储、执行器和触发器,而是使用调度器。

配置作业存储和执行器可以在调度器中完成,例如添加、修改和移除作业。

# 常用调度器:BlockingScheduler、BackgroundScheduler

# 阻塞运行,调度器在当前进程的主线程中运行
from apscheduler.schedulers.background import BlockingScheduler

# 非阻塞运行,调度器在子线程中运行
from apscheduler.schedulers.background import BackgroundScheduler
1
2
3
4
5
6
7

# 使用方法

# 1.安装模块

pip install APScheduler==3.11.0
1

# 2.创建调度器

from apscheduler.schedulers.background import BlockingScheduler

sched = BlockingScheduler()
1
2
3

# 3.添加任务

job = sched.add_job(函数对象, '触发方式', 触发参数..., args=[函数参数])

函数对象:即要作为任务执行的函数。

触发方式

  • date:在某个确定的时间点执行Job。
  • interval:以固定的时间间隔周期性地执行Job。
  • cron:在某些固定时间点周期性地执行Job。

触发参数

  • 触发方式为date时。

    # run_date='指定执行时间',例如:
    sched.add_job(my_job, 'date', run_date='2009-11-06 16:30:05')
    
    
    # run_date=时间对象,例如:
    sched.add_job(my_job, 'date', run_date=datetime(2009, 11, 6, 16, 30, 5))
    
    1
    2
    3
    4
    5
    6
  • 触发方式为interval时。

# weeks=间隔礼拜数
# days=间隔天数
# hours=间隔小时数
# minutes=间隔分钟数
# seconds=间隔秒数
# start_date=开启触发的日期时间
# end_date=结束触发的日期时间
# 例如:
sched.add_job(my_job, 'interval', hours=1)
1
2
3
4
5
6
7
8
9
  • 触发方式为cron时。
# 可以书写Cron表达式,不过需要创建CronTrigger对象。
from apscheduler.triggers.cron import CronTrigger
sched.add_job(my_job, CronTrigger.from_crontab('0 0 1-15 may-aug *'))

# 也可以使用Cron参数方式,该方式也支持指定区间。
# second=秒(0-59)
# minute=分钟(0-59)
# hour=小时(0-23)
# day=天(1-31)
# month=月(1-12)
# day_of_week=星期几(0-6)
# year=年份(4位数)
# start_date=开启触发的日期时间
# end_date=结束触发的日期时间
# timezone=时区
sched.add_job(job_function, 'cron', month='6-8,11-12', day='3rd fri', hour='0-3')
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

# 4.启动Scheduler

# 调用start()即可启动scheduler。
sched.start()
1
2

# 5.移除任务

# 从scheduler中移除一个job时,它会从关联的job stores中被移除,不再被执行。

# 第一种方式:通过调用remove_job()方法指定job的ID或job store的别名来移除。
# 需要在创建job时指定id,例如:
sched.add_job(myfunc, 'interval', minutes=2, id='my_job_id')
sched.remove_job('my_job_id')

# 第二种方式:对add_job()中得到的job实例调用remove()方法来移除,例如:
my_job = scheduler.add_job(myfunc, 'interval', minutes=2)
my_job.remove()
1
2
3
4
5
6
7
8
9
10

# 6.获取Job调度列表

# 格式化输出作业列表以及它们的触发器和下一次的运行时间。
sched.print_jobs()
1
2

# 7.暂停或恢复Job

# 暂停一个Job,调用job对象的pause()方法即可。
my_job.pause()

# 恢复一个Job,调用job对象的resume()方法即可。
my_job.resume()
1
2
3
4
5

# 8.修改Job

# 注意job的id是无法被修改的。
# 调用job对象的modify()方法即可,例如:
my_job.modify(max_instances=6, name='Alternate name')
1
2
3
#Python#模块#定时任务#调度系统
Socket
PyMySQL

← Socket PyMySQL→

最近更新
01
Vue路由
12-09
02
FastAPI实现用户管理
11-23
03
Tortoise ORM
11-23
更多文章>
Theme by Vdoing | Copyright © 2022-2026 Hoshinozora | MIT License
湘ICP备2022022820号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式