Python单例模式解决flask_apscheduler运行两次问题

背景
最近在搭建公司的自动化测试平台,有一个需求是定时执行某些自动化任务,自然需要引入一个定时任务框架。因为平台使用的是flask搭建的,自然而然的就会想到用flask_apscheduler。在引入flask_apscheduler框架后,发现每次定时任务均会执行两次,因此对该问题进行了百度/bing,网上大部分解决方案是:在app.run()中设置use_reloader=False,这样就可以避免函数被执行两次,采用上诉方案在本地调试之后依旧会执行两次,最后继续百度尝试,发现采用单例模式可以解决运行两次的问题,遂记录一下。

单例模式
单例模式是一种对象创建型模式,它提供了一种创建对象的方式,确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类,它提供全局访问的方法。

Python实现单例实例的方式
1)装饰器
2)使用__new__函数
3)直接在文件中引用

装饰器解决上述问题

from flask_apscheduler import APScheduler
# 单例模式
def Singleton(cls):
    """
    利用装饰器实现单例模式
    """
    _instance = {}

    def _singleton(*args, **kargs):
        if cls not in _instance:
            _instance[cls] = cls(*args, **kargs)
        return _instance[cls]

    return _singleton


@Singleton
class Scheduler(APScheduler):
    pass

使用__new__函数解决上述问题

from flask_apscheduler import APScheduler
class Scheduler(object):
    """
    利用__new__函数实现单例实例并且在文件中引用
    其实使用一种均可以
    """
    _instance = None
    APScheduler = None

    def __new__(cls, *args, **kw):
        if cls._instance is None:
            cls.APScheduler = APScheduler()
            cls._instance = object.__new__(cls, *args, **kw)
        return cls._instance

    def __init__(self):
        pass


scheduler = Scheduler().APScheduler  #直接在文件中引用(3方法)

最后测试一下使用单例模式和不使用单例模式的结果,测试代码如下

@scheduler.task('cron', id='test', day_of_week='*', hour=14, minute=14, end_date='2099-05-30')
def execute_by_APScheduler():
    """
    定时执行任务:
    从星期一到星期五8:30(AM)直到2099-05-30 00:00:00
    """
    print('测试单例模式下的APScheduler')

不使用单例模式结果
在这里插入图片描述

使用单例模式
在这里插入图片描述

结语:最近某项目组有一句话让我印象深刻,办法总比困难多,此时觉得这句话很应景~

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
Flask_Apscheduler 是一个用于在 Flask 网络应用中集成定时任务调度的插件。它基于 Apscheduler,提供了一种简单方便的方式来配置和管理后台任务。 使用 Flask_Apscheduler,我们可以在 Flask 应用中轻松地创建和管理任务,例如定时执行任务、周期性地执行任务等等。它允许我们根据需求灵活地配置任务的触发器,例如可以通过 cron 表达式来指定任务的定时执行。 首先,我们需要在 Flask 应用中导入 Flask_Apscheduler 扩展。然后,我们可以通过定义一个任务函数来创建任务,通过装饰器 @scheduler.task 来注册任务,并在任务函数中编写具体的执行逻辑。 除了创建任务外,我们还可以使用 Flask_Apscheduler 提供的其他功能,例如获取任务列表、启动任务调度器、关闭任务调度器、暂停或恢复任务等等。使用 Flask_Apscheduler 可以让我们更方便地管理和调度各种任务。 需要注意的是,Flask_Apscheduler 是一个扩展,需要安装 Apscheduler 才能正常使用。在安装完依赖后,我们可以在 Flask 应用中配置调度器的参数,例如任务存储方式、任务并发数等等。配置完成后,我们可以在应用中通过调用 Flask_Apscheduler 提供的方法来创建任务,并通过启动调度器来让任务按照预定的策略执行。 总的来说,Flask_Apscheduler 是一个强大的定时任务调度工具,可以与 Flask 网络应用无缝集成,帮助我们更方便地管理后台任务,并提供了多种配置选项来满足不同需求。它的使用简单,功能强大,是开发 Flask 应用中不可缺少的一部分。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

To be TestHacker

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值