百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

Flask-APScheduler使用教程

toyiye 2024-06-27 00:49 14 浏览 0 评论

Flask-APScheduler使用教程

APScheduler是一个Python库,可让您安排稍后执行的Python代码,是一套任务调度框架,可以用来做定时任务控制器,可以添加删除任务。如果将作业存储在数据库中,它们也将在调度程序重新启动后继续运行并保持其状态。重新启动调度程序后,它将运行它应该在脱机时运行的所有作业。

除此之外,APScheduler还可以用作特定于平台的调度程序(如cron守护程序或Windows任务调度程序)的跨平台,特定于应用程序的替代程序。但请注意,APScheduler本身不是守护程序或服务,也不附带任何命令行工具。它主要用于在现有应用程序中运行。也就是说,APScheduler确实为您提供了一些构建块来构建调度程序服务或运行专用的调度程序进程。

APScheduler有三个可以使用的内置调度系统:

  • Cron式调度(可选的开始/结束时间)
  • 基于区间的执行(偶数间隔运行作业,可选的开始/结束时间)
  • 一次性延迟执行(在设定的日期/时间运行一次作业)

APScheduler是一个python的第三方库,用来提供python的后台程序。包含四个组件,分别是:

  • triggers: 任务触发器组件,提供任务触发方式
  • job stores: 任务商店组件,提供任务保存方式
  • executors: 任务调度组件,提供任务调度方式
  • schedulers: 任务调度组件,提供任务工作方式

具体内容如下:

triggers: 支持三种任务触发方式

  • date:固定日期触发器,任务只运行一次,运行完毕自动清除;若错过指定运行时间,任务不会被创建参数说明run_date (datetime 或 str)作业的运行日期或时间timezone (datetime.tzinfo 或 str)指定时区例如# 在 2019-4-24 00:00:01 时刻运行一次 start_system 方法
    scheduler .add_job(start_system, 'date', run_date='2019-4-24 00:00:01', args=['text'])
  • interval:时间间隔触发器,每隔一定时间间隔执行一次。参数说明weeks (int)间隔几周days (int)间隔几天hours (int)间隔几小时minutes (int)间隔几分钟seconds (int)间隔多少秒start_date (datetime 或 str)开始日期end_date (datetime 或 str)结束日期# 在 2019-4-24 00:00:00 - 2019-4-24 08:00:00 之间, 每隔两小时执行一次 alarm_job 方法
    scheduler .add_job(alarm_job, 'interval', hours=2, start_date='2019-4-24 00:00:00' , end_date='2019-4-24 08:00:00')
  • cron:cron风格的任务触发

job stores: 支持四种任务存储方式

  • memory:默认配置任务存在内存中
  • mongdb:支持文档数据库存储
  • sqlalchemy:支持关系数据库存储
  • redis:支持键值对数据库存储

schedulers: 调度器主要分三种,一种独立运行的,一种是后台运行的,最后一种是配合其它程序使用

  • BlockingScheduler: 当这个调度器是你应用中 唯一要运行 的东西时使用
  • BackgroundScheduler: 当 不运行其它框架 的时候使用,并使你的任务在 后台运行
  • AsyncIOScheduler: 当你的程序是 异步IO模型 的时候使用
  • GeventScheduler: 和 gevent 框架配套使用
  • TornadoScheduler: 和 tornado 框架配套使用
  • TwistedScheduler: 和 Twisted 框架配套使用
  • QtScheduler: 开发 qt 应用的时候使用

1.安装

pip install Flask-APScheduler

2.在flask中使用调度器

首先在flask的create_app函数中创建最初的调度器

from apscheduler.triggers.interval import IntervalTrigger

###此方法负责初始化app
def create_app(config_name):
    app=Flask(__name__)
    CORS(app)
    app.config.from_object(config[config_name])
    config[config_name].init_app(app)
    ###初始化数据库
    db.init_app(app)
#####################################################上面代码忽略
  # 这里是重点  
  # 初始化备份数据库定时器
    scheduler.init_app(app)
    # # 解决FLASK DEBUG模式定时任务执行两次
    if os.environ.get('WERKZEUG_RUN_MAIN') == 'true':
        scheduler.api_enabled = True
        scheduler.init_app(app)
        # 实例话interval对象,如果不实例话的话有可能会报错没有interval这个
        interval = IntervalTrigger(
            days = 2,
            start_date='2019-4-24 08:00:00',
            end_date='2099-4-24 08:00:00',
            timezone='Asia/Shanghai')
        # dbDump 是一个备份数据库的函数,这个根据自己的实际情况来看
        scheduler.add_job(func=dbDump,trigger=interval,id='bak_one')
        scheduler.start()
######################################################下面代码忽略

    ###初始化上传下载和导出目录
    # init_static_path()
    ###注册蓝图
    register_app(app)
    # ###初始化日志
    init_log()
    return app

如果需要重新替换上面的任务可以在任务中多添加一个参数replace_existing=True由上面的两天备份一次 变成每天备份一次。配置成功后他会自动去替换上面的定时器。

 # 判断配置文件变化 更新定时任务
if os.environ.get('WERKZEUG_RUN_MAIN') == 'true':
    interval = IntervalTrigger(
    days=1,
    start_date='2019-4-24 08:00:00',
    end_date='2099-4-24 08:00:00',
    timezone='Asia/Shanghai')
    scheduler.add_job(
    func=dbDump,
        trigger=interval,
        id='bak_one', 
        replace_existing=True)

replace_existing=True 这个参数非常重要,在这个地方弄了很久,开始一直不能替换第一次任务。

问题解决:

scheduler.add_job(dbDump,'interval',id='bak_one',days=1,start_date='2019-4-24 08:00:00',end_date='2099-4-24 08:00:00',replace_existing=True)

如果是按照上面创建的任务的话在使用pyinstaller打包生成的可执行文件,运行的时候会出现如下面的问题

APScheduler: LookupError: No trigger by the name “interval” was found

解决方案是:替换成我上面的方式去创建任务就可以解决的。



相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码