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 相关文章推荐
pydev使用wxpython找不到路径的解决方法
Feb 10 Python
Python Matplotlib库入门指南
May 18 Python
Python字符串处理之count()方法的使用
May 18 Python
python选择排序算法实例总结
Jul 01 Python
Python将阿拉伯数字转换为罗马数字的方法
Jul 10 Python
Python3使用requests发闪存的方法
May 11 Python
JSONLINT:python的json数据验证库实例解析
Nov 28 Python
10 行 Python 代码教你自动发送短信(不想回复工作邮件妙招)
Oct 11 Python
python3.6使用pickle序列化class的方法
Oct 22 Python
python实现趣味图片字符化
Apr 30 Python
使用Pycharm在运行过程中,查看每个变量的操作(show variables)
Jun 08 Python
解决Pytorch半精度浮点型网络训练的问题
May 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
基于linnux+phantomjs实现生成图片格式的网页快照
2015/04/15 PHP
php中session定期自动清理的方法
2015/11/12 PHP
PHP在linux上执行外部命令的方法
2017/02/06 PHP
PHP安装BCMath扩展的方法
2019/02/13 PHP
PHP中abstract(抽象)、final(最终)和static(静态)原理与用法详解
2020/06/05 PHP
JavaScript Scoping and Hoisting 翻译
2012/07/03 Javascript
javascript中使用正则计算中文长度的例子
2014/04/29 Javascript
详细分析JavaScript变量类型
2015/07/08 Javascript
JS实现点击上移下移LI行数据的方法
2015/08/05 Javascript
jQuery在线选座位插件seat-charts特效代码分享
2015/08/27 Javascript
通过隐藏iframe实现无刷新上传文件操作
2016/03/16 Javascript
浅谈AngularJS中ng-class的使用方法
2016/11/11 Javascript
使用jQuery实现页面定时弹出广告效果
2017/08/24 jQuery
纯js封装的ajax功能函数与用法示例
2018/05/14 Javascript
node.js中TCP Socket多进程间的消息推送示例详解
2018/07/10 Javascript
微信小程序表单验证form提交错误提示效果
2020/06/19 Javascript
vuex实现数据状态持久化
2019/11/11 Javascript
python2 与 pyhton3的输入语句写法小结
2018/09/10 Python
python中比较两个列表的实例方法
2019/07/04 Python
django之使用celery-把耗时程序放到celery里面执行的方法
2019/07/12 Python
使用Python调取任意数字资产钱包余额功能
2019/08/15 Python
python对文件的操作方法汇总
2020/02/28 Python
详解Python 实现 ZeroMQ 的三种基本工作模式
2020/03/24 Python
Python 必须了解的5种高级特征
2020/09/10 Python
韩国三大免税店之一:THE GRAND 中文免税店
2016/07/21 全球购物
世界首屈一指的在线男士内衣权威:HisRoom
2017/08/05 全球购物
be2台湾单身男女交友:全球网路婚姻介绍的领导品牌
2019/10/11 全球购物
Java的接口和C++的虚类的相同和不同处
2014/03/27 面试题
编写一个类体现构造,公有,私有方法,静态,私有变量
2013/08/10 面试题
审计专业自荐信范文
2014/04/21 职场文书
高中生第一学年自我鉴定
2014/09/12 职场文书
土地转让协议书
2014/09/27 职场文书
2015年团队工作总结范文
2015/05/04 职场文书
2016年寒假见闻
2015/10/10 职场文书
css3带你实现3D转换效果
2022/02/24 HTML / CSS
MySQL 原理与优化之Limit 查询优化
2022/08/14 MySQL