Python定时任务APScheduler原理及实例解析

作者:BSSZDS930 时间:2021-04-01 01:07:09 

定时任务:

1、 线程睡眠函数 sleep() ——粗暴!一直占有 CPU 资源,导致后续操作无法执行

2、 threading.Timer(10, task, ()).start() # (间隔s,任务task, 函参)

3、 import sched


# 初始化 sched 模块的 scheduler 类
scheduler = sched.scheduler(time.time, time.sleep)
# 增加调度任务 enter(delay, priority, action, argument=(), kwargs={})
scheduler.enter(10, 1, task)
# 运行任务
scheduler.run()

scheduler 中的每个调度任务只会工作一次,不会无限循环被调用。如果想重复执行同一任务, 需要重复添加调度任务即可。

  • enter(delay, priority, action, argument=(), kwargs={}) 间隔执行任务。delay单位是秒。priority越小优先级越大。两个任务指定相同的延迟时间,优先级大的任务会向被执行。action 即需要执行的函数,argument 和 kwargs 分别是函数的位置和关键字参数。

  • scheduler.enterabs(time, priority, action, argument=(), kwargs={}) 时间点执行任务。因此,time是绝对时间.其他参数用法与 enter() 中的参数用法是一致。

APScheduler——Advanced Python Scheduler。

一个轻量级的 Python 定时任务调度框架。APScheduler 支持三种调度任务:固定时间间隔,固定时间点(日期),Linux下Crontab 命令。同时,它还支持异步执行、后台执行调度任务。


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

def timedTask():
 print(datetime.datetime.utcnow().strftime("%Y-%m-%d %H:%M:%S.%f")[:-3])

if __name__ == '__main__':
 # 1.创建后台执行的 schedulers
 scheduler = BackgroundScheduler()
 # 2.添加调度任务,调度方法为 timedTask,触发器选择 interval(间隔性),间隔时长为 2 秒
 job = scheduler.add_job(timedTask, 'interval', seconds=2)
 # 3.启动调度任务
 scheduler.start()

while True:
   print(time.time())
   time.sleep(5)

基础组件

  • schedulers(调度器)它是任务调度器,属于控制器角色。它配置作业存储器和执行器可以在调度器中完成,例如添加、修改和移除作业。

    • BlockingScheduler : 调度器在当前进程的主线程中运行,也就是会阻塞当前线程。

    • BackgroundScheduler : 调度器在后台线程中运行,不会阻塞当前线程。

    • AsyncIOScheduler : 结合 asyncio 模块(一个异步框架)一起使用。

    • GeventScheduler : 程序中使用 gevent(高性能的Python并发框架)作为IO模型,和 GeventExecutor 配合使用。

    • TornadoScheduler : 程序中使用 Tornado(一个web框架)的IO模型,用 ioloop.add_timeout 完成定时唤醒。

    • TwistedScheduler : 配合 TwistedExecutor,用 reactor.callLater 完成定时唤醒。

    • QtScheduler : 你的应用是一个 Qt 应用,需使用QTimer完成定时唤醒。

  • triggers(触发器)描述调度任务被触发的条件。不过触发器完全是无状态的。

    • date 时间点触发: scheduler .add_job(job_func, 'date', run_date=datetime(2017, 12, 13, 14, 0, 0), args=['text'])

    • interval 固定时间间隔触发: scheduler .add_job(job_func, 'interval', minutes=2, start_date='2017-12-13 14:00:01' , end_date='2017-12-13 14:00:10')

    • cron 特定时间周期性地触发: scheduler .add_job(job_func, 'cron', month='1-3,7-9',day='0, tue', hour='0-3')

  • job stores(作业存储器)任务持久化仓库,默认保存任务在内存中,也可将任务保存都各种数据库中,任务中的数据序列化后保存到持久化数据库,从数据库加载后又反序列化。

    • 有两种添加方法,一是 add_job(), 二是scheduled_job()修饰器来修饰函数。区别是:第一种方法返回一个 apscheduler.job.Job 的实例,可用来改变或移除 job。第二种方法只适用于应用运行期间不会改变的 job。

    • 移除 job 也有两种方法:remove_job() 和 job.remove()。

    • remove_job() 是根据 job 的 id 来移除,所以要在 job 创建时指定一个 id。job.remove() 则是对 job 执行 remove 方法即可。

    • 获取 job 列表:通过 scheduler.get_jobs() 方法能够获取当前调度器中的所有 job 的列表。

    • 修改job: 用Job.modify() 或 modify_job()方法来修改 job 的属性。但注意job 的 id 是无法被修改的。

    • 关闭 job:默认情况下调度器会等待所有正在运行的作业完成后,关闭所有的调度器和作业存储。如果你不想等待,可以将 wait 选项设置为 False。

    • 更新任务reschedule_job()

  • executors(执行器)负责处理作业的运行,它们通常通过在作业中提交指定的可调用对象到一个线程或进城池来进行。当作业完成时,执行器将会通知调度器。最常用的 executor 有两种:ProcessPoolExecutor 和 ThreadPoolExecutor

来源:https://www.cnblogs.com/bsszds930/p/12938998.html

标签:python,定时,任务,APScheduler
0
投稿

猜你喜欢

  • 基于Python实现西西成语接龙小助手

    2023-04-02 22:12:04
  • 五种提高 SQL 性能的方法

    2008-05-16 10:40:00
  • Keras神经网络efficientnet模型搭建yolov3目标检测平台

    2021-10-08 11:45:33
  • python设置环境变量的作用和实例

    2021-07-03 05:03:17
  • MySQL 查看链接及杀掉异常链接的方法

    2024-01-27 00:29:40
  • python进阶教程之函数对象(函数也是对象)

    2022-08-28 01:06:42
  • 基于GORM实现CreateOrUpdate方法详解

    2024-02-14 09:18:02
  • Python Flask请求扩展与中间件相关知识总结

    2022-03-10 17:03:06
  • vuex中使用对象展开运算符的示例

    2024-05-28 15:59:44
  • 科学知识:理解socket

    2022-11-28 09:50:07
  • 如何利用Python识别图片中的文字详解

    2021-02-07 21:05:30
  • 无法远程登入MySQL数据库的几种解决办法

    2012-04-13 11:57:41
  • Python中实现一行拆多行和多行并一行的示例代码

    2021-05-20 12:32:26
  • PHP实现无限极分类的两种方式示例【递归和引用方式】

    2023-11-15 18:26:33
  • 异地远程访问本地SQL Server数据库

    2024-01-18 20:00:18
  • Python语法学习之正则表达式的量词汇总

    2023-07-20 03:08:59
  • Python3 如何开启自带http服务

    2023-07-27 14:33:46
  • pytorch中的model=model.to(device)使用说明

    2023-02-23 15:07:48
  • python 二维矩阵转三维矩阵示例

    2023-09-14 03:53:56
  • 浅谈Python3中datetime不同时区转换介绍与踩坑

    2021-05-16 15:29:46
  • asp之家 网络编程 m.aspxhome.com