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


Posted in Python onMay 30, 2020

定时任务:

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python中对list去重的多种方法
Sep 18 Python
在Django的模型和公用函数中使用惰性翻译对象
Jul 27 Python
python如何查看系统网络流量的信息
Sep 12 Python
python 循环读取txt文档 并转换成csv的方法
Oct 26 Python
python之pexpect实现自动交互的例子
Jul 25 Python
对Django外键关系的描述
Jul 26 Python
Python中字典与恒等运算符的用法分析
Aug 22 Python
Python数据存储之 h5py详解
Dec 26 Python
Python变量、数据类型、数据类型转换相关函数用法实例详解
Jan 09 Python
python为QT程序添加图标的方法详解
Mar 09 Python
python基础之匿名函数详解
Apr 21 Python
python基础之类方法和静态方法
Oct 24 Python
Python生成器next方法和send方法区别详解
May 30 #Python
Python新手学习标准库模块命名
May 29 #Python
Django Path转换器自定义及正则代码实例
May 29 #Python
Python新手如何理解循环加载模块
May 29 #Python
Python新手如何进行闭包时绑定变量操作
May 29 #Python
如何理解python中数字列表
May 29 #Python
Django实现前台上传并显示图片功能
May 29 #Python
You might like
ThinkPHP CURD方法之limit方法详解
2014/06/18 PHP
PHP解析RSS的方法
2015/03/05 PHP
用prototype实现的简单小巧的多级联动菜单
2007/03/24 Javascript
js判断iframe内的网页是否滚动到底部触发事件
2014/03/18 Javascript
jQuery操作select下拉框的text值和value值的方法
2014/05/31 Javascript
javascript实现超炫的向上滑行菜单实例
2015/08/03 Javascript
js实现类似MSN提示的页面效果代码分享
2015/08/24 Javascript
基于jquery实现省市区三级联动效果
2015/12/25 Javascript
Node.js编写组件的三种实现方式
2016/02/25 Javascript
JavaScript中的操作符类型转换示例总结
2016/05/30 Javascript
jquery实现界面无刷新加载登陆注册
2016/07/30 Javascript
vue-router2.0 组件之间传参及获取动态参数的方法
2017/11/10 Javascript
解决vue build打包之后首页白屏的问题
2018/03/06 Javascript
详解vue修改elementUI的分页组件视图没更新问题
2020/11/13 Javascript
介绍Python中的一些高级编程技巧
2015/04/02 Python
Python使用回溯法子集树模板获取最长公共子序列(LCS)的方法
2017/09/08 Python
python中kmeans聚类实现代码
2018/02/23 Python
Python简单实现网页内容抓取功能示例
2018/06/07 Python
Python如何实现在字符串里嵌入双引号或者单引号
2020/03/02 Python
Pygame的程序开始示例代码
2020/05/07 Python
python 写函数在一定条件下需要调用自身时的写法说明
2020/06/01 Python
QT5 Designer 打不开的问题及解决方法
2020/08/20 Python
Python QT组件库qtwidgets的使用
2020/11/02 Python
CSS3 实现图形下落动画效果
2020/11/13 HTML / CSS
html5手机键盘弹出收起的处理
2020/01/20 HTML / CSS
软件测试题目
2013/02/27 面试题
促销活动策划方案
2014/01/12 职场文书
特色蛋糕店创业计划书
2014/01/28 职场文书
JAVA程序员自荐书
2014/01/30 职场文书
大学生秋游活动方案
2014/02/17 职场文书
保安队长职务说明书
2014/02/23 职场文书
大学毕业生求职自荐书
2014/06/05 职场文书
党的群众路线教育实践活动对照检查材料
2014/09/22 职场文书
群众路线自我剖析材料
2014/10/08 职场文书
如何书写邀请函?
2019/06/24 职场文书
创业计划书之酒吧
2019/12/02 职场文书