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
猜你喜欢
- 异常是指因为程序出现了错误而在正常控制流以外采取的行动,其分为两个阶段,第一阶段是引发异常的错误,当系统检测到错误并且意识到异常条件,解释器
- 维护脚本一例,写得有点乱,只是作为一个实例,演示如何快速利用工具快速达到目的:应用到:shell与python数据交互、数据抓取,编码转换#
- 前言Iframe 是一种将网页嵌入到另一个页面的内容中的方法。这是通过使用 HTML 元素、外部网站的 URL 以及窗口在您的网站上的外观参
- python中的class_static的@classmethod的使用 classmethod的使用,主要针对的是类而不是对象,在定义类的
- 前言在网上找了很多Python处理Excel的方法和代码,都不是很尽人意,所以自己综合网上各位大佬的方法,自己进行了优化,具体的代码如下。博
- 尼姆游戏是个著名的游戏,有很多变种玩法。两个玩家轮流从一堆物品中拿走一部分。在每一步中,玩家可以自由选择拿走多少物品,但是必须至少拿走一个并
- PyTorch: https://github.com/shanglianlm0525/PyTorch-Networksimport tor
- rs.open sql,conn:如果sql是delete,update,insert则会返回一个关闭的记录集,在使用过程中不要来个rs.c
- 1.sort()方法sort()是列表的方法,修改原列表使得它按照大小排序,没有返回值,返回NoneIn [90]: x = [4, 6,
- 如果不用类库(如jquery)来写,往往很多时候,都需要通过id或tag来获取html里的某一对象,然后对其进行操作。为了节省代码,把常用的
- 前言Tkinter是python内置的标准GUI库,基于Tkinter实现了简易人员管理系统,所用数据库为Mongodb代码时间宝贵!直接上
- 本教程使用的是python 3 和django为事例打开pycharmfile -> new
- 过去一段时间人们似乎又非常热衷于探讨网络文档的印刷格式,涌现了很多与之相关的技术与理论资料,其中相当重要的一个领域就是关于印刷中字号和行高的
- 前言 常用地图底图的绘制一般由Basemap或者cartopy模块完成,由于Basemap库是基于python2开发的一个模块,目前已经不开
- 本文介绍了SpringBoot 中使用JSP的方法示例,分享给大家,具体如下:依赖: <parent>
- 本文实例讲述了python中getaddrinfo()基本用法。分享给大家供大家参考。具体如下:import sys, socketresu
- 本系列教程我们将使用python实现一些简单的测试工具,为了尽可能的简单,我们的工具以命令行工具为主。本系列教程使用的python版本是3.
- 其实这个话题已经在侧面写了好几篇深刻反思,用我自己几年工作实践的体会来看,性格决定了将来的发展。某些特质虽然可以掩饰,但在这之上必然不可能有
- 最近接触了一些selenium模块的相关知识,觉得还挺有意思的,于是决定亲自尝试写一些爬虫程序来强化selenium模块(一定要多尝试、多动
- 在上一篇Python接口自动化测试系列文章:Python接口自动化浅析logging日志原理及模块操作流程,主要介绍日志相关概念及loggi