flask-apscheduler实现定时任务

秋风阁-北溪入江流
flask-apscheduler是一个支持apscheduler的flask插件,通过flask-apscheduler可以很方便的定义定时任务。

安装flask-apscheduler

pip install flask-apscheduler

flask-apscheduler组件

apscheduler库包含有组件:

  • triggers(触发器)
  • job stores(作业存储)
  • executors(执行者)
  • schedulers(调度程序)

triggers触发器

在apscheduler中将一个定时任务称为job作业,在设置job时,需要为其选择特点的触发器。
触发器:确定作业运行时计算日期/时间的逻辑。
在apscheduler中具有以下三种内置的触发器类型:

  • date: 期望在某个时间点运行一次作业时使用该触发器
    • run_date: 运行作业的日期/时间,为空则使用当前时间
    • timezone: 时区
  • interval: 期望以固定的时间间隔运行作业时使用该触发器
    • weeks: 间隔的周数
    • days: 间隔的天数
    • hours: 间隔的小时数
    • minutes: 间隔的分钟数
    • seconds: 间隔的秒数
    • start_date: 间隔计算的起点。若指定则成指定时间开始,否则以当前时间开始。
    • end_date: 最晚可能触发的日期/时间
    • timezone: 时区
    • jitter: 最多延迟几秒执行
  • cron: 当想在特定时间定期运行作业时使用该触发器
    • year: 4位数年份
    • month: 月
    • day: 一个月中的某一天天
    • week: ISO周(1~31)
    • day_of_week: 工作日的数字或者名称(0~6或mon, tue, wed, thu, fri, sat, sun)
    • hour: 小时
    • minute: 分钟
    • second: 秒
    • start_date: 最早可能的触发时间。若指定则成指定时间开始,否则以当前时间开始。
    • end_date: 最晚可能触发的日期/时间
    • timezone: 时区
    • jitter: 最多延迟几秒执行

flask-apscheduler的使用

参数配置

特定于flask-apscheduler的配置选项

# 是否开启api查看定时任务的配置
# 设置为True后,可以通过SCHEDULER_API_PREFIX接口访问定时任务配置界面
SCHEDULER_API_ENABLED: bool (default: False)
# 设置访问查看定时任务配置的api接口
SCHEDULER_API_PREFIX: str (default: "/scheduler")
# 调度程序endpoint前缀
SCHEDULER_ENDPOINT_PREFIX: str (default: "scheduler.")
# 允许访问调度器的主机
SCHEDULER_ALLOWED_HOSTS: list (default: ["*"])

在测试定时任务时,建议将SCHEDULER_API_ENABLED设置为True,方便前端查看定时任务。
若开启api后访问接口后端报错KeyError: 'JSONIFY_PRETTYPRINT_REGULAR',可在配置中添加布尔类型的JSONIFY_PRETTYPRINT_REGULAR,值设置为TrueFalse都可以,设置为True仅会在前端界面以更美观的方式显示内容。

适用于apscheduler的配置选项

# 持久化配置
SCHEDULER_JOBSTORES: dict
# 执行器,线程池配置
SCHEDULER_EXECUTORS: dict
# 作业默认值配置
SCHEDULER_JOB_DEFAULTS: dict
# 时区设置
SCHEDULER_TIMEZONE: dict

定时任务设置方法

配置项设置定时任务

flask-apscheduler的定时任务在配置项中设置,通过字典保存作业的相关信息,多个作业时,在列表中进行作业的存储。

class SchedulerConfig:
	JSONIFY_PRETTYPRINT_REGULAR = True
    SCHEDULER_API_ENABLED = True
	JOBS = [
        {
            'id': 'job1',
			# func通过`模块名:方法名`的方式进行设置
            'func': 'run:add',
            'args': (1, 2),
            'trigger': 'interval',
            'seconds': 3
        }
    ]

配置项设置的优点是配置麻烦,不直观,但是方便对定时任务进行统一管理

装饰器设置定时任务

在装饰器中设置定时任务,简单方便。

@scheduler.task('interval', id='job1', args=(1, 2), seconds=3)
def add(a, b):
	print(a + b)

完整示例与定时任务的启动

定时任务的执行需要先初始化一个执行程序,添加好配置和作业后,通过start()方法启动定时任务。

完整示例(以装饰器的方式为例)

import time

from flask import Flask
from flask_apscheduler import APScheduler

app = Flask(__name__)

scheduler = APScheduler()

start = time.time()


@scheduler.task('interval', id='job1', seconds=3)
def print_interval():
    global start
    print(f"间隔时间:{round(time.time() - start)}")
    start = time.time()


class Config:
    JSONIFY_PRETTYPRINT_REGULAR = True
    SCHEDULER_API_ENABLED = True


app.config.from_object(Config)

scheduler.init_app(app)

print(scheduler.api_enabled)
scheduler.start()

if __name__ == '__main__':
    app.run()

示例的执行结果如下所示:

间隔时间:3
间隔时间:3
间隔时间:3
...

可以看到每3秒进行了一次打印操作,完美的执行了期望的要求。

api查看

访问${SCHEDULER_API_PREFIX}/jobs接口:

[
  {
    "id": "job1",
    "name": "print_interval",
    "func": "__main__:print_interval",
    "args": [],
    "kwargs": {},
    "trigger": "interval",
    "start_date": "2023-07-11T12:09:49.057865+08:00",
    "seconds": 3,
    "misfire_grace_time": 1,
    "max_instances": 1,
    "next_run_time": "2023-07-11T12:11:31.057865+08:00"
  }
]
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 可以使用Flask-APScheduler在MongoDB中实现定时任务,只需要在Flask应用中定义一个定时任务,并将其配置为在MongoDB中运行。具体代码如下:from flask_apscheduler import APSchedulerscheduler = APScheduler()# Configure the scheduler to use MongoDB as its job store scheduler.add_jobstore('mongodb', host='localhost', database='your_database_name')@scheduler.task('interval', id='do_job_1', seconds=30) def job_1(): print("Job 1 executed")@scheduler.task('cron', id='do_job_2', day_of_week='mon-sun', hour='12', minute='30') def job_2(): print("Job 2 executed")# Start the scheduler scheduler.start() ### 回答2: 要使用Flask-APScheduler实现数据库MongoDB定时任务,首先需要安装Flask-APScheduler和pymongo库。在Flask应用程序中,可以使用以下代码实现: 1. 首先,在app.py文件中导入所需的模块和库: ```python from flask import Flask from flask_apscheduler import APScheduler from pymongo import MongoClient ``` 2. 创建Flask应用程序实例: ```python app = Flask(__name__) ``` 3. 配置MongoDB连接并创建MongoDB客户端: ```python app.config['MONGO_URI'] = 'mongodb://localhost:27017/db_name' mongo_client = MongoClient(app.config['MONGO_URI']) ``` 请注意,`db_name`应替换为你的实际数据库名称,`localhost:27017`应替换为你的MongoDB服务器地址和端口。 4. 初始化APScheduler实例并配置任务存储: ```python scheduler = APScheduler() scheduler.init_app(app) scheduler.start() ``` 5. 创建一个定时任务函数,该函数将执行需要定时执行的操作。这里以向MongoDB数据库中插入一条记录为例: ```python def insert_data(): db = mongo_client.db_name collection = db.collection_name data = {'name': 'John', 'age': 30} collection.insert_one(data) ``` 请注意,`db_name`和`collection_name`应替换为你的实际数据库和集合名称。 6. 创建一个定时任务,并将其添加到APScheduler中: ```python scheduler.add_job(func=insert_data, trigger='interval', seconds=60) ``` 这将每隔60秒执行一次`insert_data`函数。 7. 最后,在Flask应用程序的入口处,启动Flask应用程序: ```python if __name__ == '__main__': app.run() ``` 以上代码片段演示了如何使用Flask-APScheduler和pymongo库实现数据库MongoDB定时任务的基本步骤。根据实际需求,你可以根据需要调整设置和任务函数。 ### 回答3: 要使用Flask-APScheduler实现MongoDB数据库定时任务,需要先安装FlaskFlask-APScheduler库,并且确保MongoDB数据库已经正确安装和配置。 首先,在Flask应用中导入所需要的库和模块: ```python from flask import Flask from flask_apscheduler import APScheduler from pymongo import MongoClient ``` 然后,创建Flask应用和APScheduler实例并配置MongoDB数据库的连接: ```python app = Flask(__name__) scheduler = APScheduler() scheduler.init_app(app) # 配置MongoDB数据库连接 client = MongoClient('mongodb://localhost:27017/') # 替换为实际的MongoDB连接地址 db = client['mydatabase'] # 替换为实际的数据库名称 ``` 接下来,创建一个定时任务函数,该函数在特定时间间隔内会被调度执行,并且可以在函数中访问MongoDB数据库: ```python @scheduler.task('interval', id='my_job', minutes=30) def my_task(): collection = db['mycollection'] # 替换为实际的集合名称 # 在此处添加需要执行的MongoDB操作,例如插入、更新、删除等 # 例如:collection.insert_one({"name": "example"}) ``` 最后,启动定时任务调度器和Flask应用: ```python @app.route('/') def index(): return 'Flask-APScheduler MongoDB Demo' if __name__ == '__main__': scheduler.start() app.run() ``` 启动应用后,定时任务会按照预定的时间间隔执行,并且可以在`my_task()`函数中进行MongoDB的操作。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

北溪入江流

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

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

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

打赏作者

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

抵扣说明:

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

余额充值