公司部署了centos 服务器,使用flask 框架来快速部署api,需要在脚本flask 功能里面做一个定时的操作
发现定时时间到的时候会运行两次,百度查询很多的文章,使用的方法是吧debug=False,或者reload=False 等设置的操作,发现不一定能起到作用,反而可能导致其他的问题出现
#我的代码,定时做一些数据库的操作,虽然数据有触发器但是懒得查询了。。。
@scheduler.task('interval', id='do_job_1', seconds=60 * 60 * 7, misfire_grace_time=900)
def do_s():
loguru.logger.warning('adsfasfasdf')# 运行过程会出现连续打印两次的情况
domysql.del_day_data()
具体的原因很可能是时间到的时候被实例化了多次的原因导致的。
如果是多次实例化的原因导致的话,那我们可以使用单例来实现避免多次运行和实例化导致这样的情况出现
# 具体的python 单例的方法可以去查询,有多种方法可行,下面是使用new 的方法来实现单例的
from flask_apscheduler import APScheduler
class MyScheduler(object):
_instance = None # 初始值
APScheduler = None # 初始值
def __new__(cls, *args, **kw):
if cls._instance is None:
# 第一次初始的时候None ,就做初始化的操作,如果不是第一次就返回第一次生成的对象
cls.APScheduler = APScheduler()
cls._instance = object.__new__(cls, *args, **kw)
return cls._instance
def __init__(self):
pass
scheduler = Scheduler().APScheduler # 暴露,方便后续的引用
#在flask 里面的使用如下:
# coding=utf-8
# 作者:Administrator
# 创建时间:2022 2022/7/12 9:10
# IDE:PyCharm
# 描述:接口的编写,可能后期的网站也需要做
import json
import os
from flask import Flask, request
from my_scheduler import scheduler
app = Flask(__name__, template_folder='templates')
client = MyRedis()
myredis = client.conn
#定时任务,7个小时做函数里面的操作,这样就不会出现多次运行定时任务的情况
@scheduler.task('interval', id='do_job_1', seconds=60 * 60 * 7, misfire_grace_time=900)
def do_s():
loguru.logger.warning('adsfasfasdf')# 运行过程会出现连续打印两次的情况
domysql.del_day_data()
class Config(object):
SCHEDULER_API_ENABLED = True# 可以 IP:5000/scheduler 查看所有的=定时任务内容
if __name__ == '__main__':
app.config.from_object(Config())
scheduler.init_app(app)
scheduler.start()
app.run(host=‘localhost’, port=5000)