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使用clear方法清除字典内全部数据实例
Jul 11 Python
Python使用Srapy框架爬虫模拟登陆并抓取知乎内容
Jul 02 Python
用生成器来改写直接返回列表的函数方法
May 25 Python
Python实现的寻找前5个默尼森数算法示例
Mar 25 Python
python3使用smtplib实现发送邮件功能
May 22 Python
在Python中字典根据多项规则排序的方法
Jan 21 Python
python实现nao机器人身体躯干和腿部动作操作
Apr 29 Python
Python实现的对一个数进行因式分解操作示例
Jun 27 Python
Python中如何引入第三方模块
May 27 Python
Python内置方法和属性应用:反射和单例(推荐)
Jun 19 Python
python基于pexpect库自动获取日志信息
Feb 01 Python
Python编写nmap扫描工具
Jul 21 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
PHP程序开发范例学习之表单 获取文本框的值
2011/08/08 PHP
PHP、Java des加密解密实例
2015/04/27 PHP
jqPlot Option配置对象详解
2009/07/25 Javascript
idTabs基于JQuery的根据URL参数选择Tab插件
2012/04/11 Javascript
多个datatable共存造成多个表格的checkbox都被选中
2013/07/11 Javascript
node.js应用后台守护进程管理器Forever安装和使用实例
2014/06/01 Javascript
js实现头像图片切割缩放及无刷新上传图片的方法
2015/07/17 Javascript
Javascript中级语法快速入手
2016/07/30 Javascript
Javascript中apply、call、bind的巧妙使用
2016/08/18 Javascript
如何快速解决JS或Jquery ajax异步跨域的问题
2018/01/08 jQuery
微信小程序实现的涂鸦功能示例【附源码下载】
2018/01/12 Javascript
vue.js实现插入数值与表达式的方法分析
2018/07/06 Javascript
React实现全局组件的Toast轻提示效果
2018/09/21 Javascript
Vue2.x中利用@font-size引入字体图标报错的解决方法
2018/09/28 Javascript
vuex存储复杂参数(如对象数组等)刷新数据丢失的解决方法
2019/11/05 Javascript
vue element table中自定义一些input的验证操作
2020/07/18 Javascript
[55:56]NB vs Infamous 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.22
2019/09/05 DOTA
[06:48]DOTA2-DPC中国联赛2月26日Recap集锦
2021/03/11 DOTA
centos6.7安装python2.7.11的具体方法
2017/01/16 Python
python爬虫正则表达式之处理换行符
2018/06/08 Python
Python数据类型之Number数字操作实例详解
2019/05/08 Python
pyqt5 QProgressBar清空进度条的实例
2019/06/21 Python
PyTorch的深度学习入门教程之构建神经网络
2019/06/27 Python
python用for循环求和的方法总结
2019/07/08 Python
Django框架静态文件使用/中间件/禁用ip功能实例详解
2019/07/22 Python
python3.6、opencv安装环境搭建过程(图文教程)
2019/11/05 Python
IntelliJ 中配置 Anaconda的过程图解
2020/06/01 Python
你需要学会的8个Python列表技巧
2020/06/24 Python
颇特女士:NET-A-PORTER(直邮中国)
2020/07/11 全球购物
企业员工爱岗敬业演讲稿
2014/08/26 职场文书
商务英语专业大学生职业生涯规划书
2014/09/14 职场文书
教师节简报
2015/07/20 职场文书
2016年大学生实习单位评语
2015/12/01 职场文书
详解Python 3.10 中的新功能和变化
2021/04/28 Python
「睡美人」爱洛公主粘土人开订
2022/03/22 日漫
Redis实现主从复制方式(Master&Slave)
2022/06/21 Redis