python3+flask 开发web(九)——flask_apscheduler定时任务框架

本文介绍如何使用APScheduler框架在Flask中创建定时任务系统。通过安装Flask-APScheduler并配置任务,可以实现基于时间间隔或特定时间触发的任务执行。示例代码展示了如何定义任务函数和配置定时任务。

APScheduler是一款功能非常强大的定时任务框架。利用APScheduler框架我们可以很方便实现一个基于Python的定时任务系统。Flask提供了对应的Flask-APScheduler来集成APScheduler功能。

1)安装

pip install Flask-APScheduler

2)代码:

from flask_apscheduler import APScheduler
from flask import Flask


class Config(object):
    JOBS=[
        {
            'id':'job1',
            'func':'__main__:job_1',
            'args':(1,2),
            'trigger':'cron',
            'hour':17,
            'minute':8
        },
        {
            'id':'job2',
            'func':'__main__:job_1',
            'args':(3,4),
            'trigger':'interval',
            'seconds':5
        }
    ]
def job_1(a,b):   # 一个函数,用来做定时任务的任务。
    print(str(a)+' '+str(b))

app=Flask(__name__) # 实例化flask

app.config.from_object(Config())# 为实例化的flask引入配置

@app.route('/')  # 首页路由
def hello_world():
    return 'hello'


if __name__=='__main__':
    scheduler=APScheduler()  # 实例化APScheduler
    scheduler.init_app(app)  # 把任务列表放进flask
    scheduler.start() # 启动任务列表
    app.run()  # 启动flask

JOBS配置文件中:其中id是一个标识,func指定定时执行的函数,args指定输入参数列表,trigger指定任务类型,如interval表示时间间隔,seconds表示时间周期,单位是秒

3)执行结果

控制台输出:

 

<think>我们讲解Flask-APScheduler,这是一个Flask扩展,用于在Flask应用中添加APScheduler功能,实现定时任务APScheduler(Advanced Python Scheduler)是一个Python库,用于在指定时间执行作业(job),支持多种调度方式(如日期、固定时间间隔、cron表达式等)。 在Flask中使用APScheduler,可以通过Flask-APScheduler扩展,它简化了APSchedulerFlask中的集成。 安装: pip install Flask-APScheduler 主要组件: - Scheduler: 调度器,负责配置和调度任务。 - Job Store: 作业存储,用于存储作业信息(默认使用内存存储)。 - Executor: 执行器,用于执行作业(默认使用线程池执行器)。 - Trigger: 触发器,定义作业触发条件(日期、间隔、cron表达式)。 使用步骤: 1. 在Flask应用中初始化Flask-APScheduler。 2. 配置调度器(可选,可以通过Flask配置或代码配置)。 3. 定义要执行的任务(函数)。 4. 添加作业(可以通过装饰器或add_job方法)。 配置项(常用): - SCHEDULER_API_ENABLED: 是否启用API(默认为False),如果启用,可以通过REST API管理任务。 - SCHEDULER_TIMEZONE: 设置时区(例如:&#39;Asia/Shanghai&#39;)。 - SCHEDULER_JOBSTORES: 配置作业存储(例如使用数据库存储)。 - SCHEDULER_EXECUTORS: 配置执行器。 - SCHEDULER_JOB_DEFAULTS: 配置作业默认参数(例如:coalesce合并执行,misfire_grace_time容错时间等)。 添加作业的方式: 方式1:使用装饰器 @scheduler.task(&#39;cron&#39;, id=&#39;my_job&#39;, hour=&#39;*&#39;) def my_job(): print("This job is run every hour.") 方式2:使用add_job方法 def my_job(): print("This job is run every hour.") scheduler.add_job(id=&#39;my_job&#39;, func=my_job, trigger=&#39;cron&#39;, hour=&#39;*&#39;) 触发器类型(trigger): - &#39;date&#39;: 在某个特定时间点执行一次。 - &#39;interval&#39;: 按照固定时间间隔执行。 - &#39;cron&#39;: 使用cron表达式指定执行时间。 注意:在部署时,如果使用多进程部署(如gunicorn多worker),可能会遇到多个调度器同时运行的问题。为了避免这种情况,通常需要确保只有一个worker进程运行调度器。可以通过环境变量或配置来指定主进程。 下面是一个完整的示例代码:</think>### Flask-APScheduler 定时任务详解 Flask-APSchedulerAPSchedulerFlask 扩展,用于在 Flask 应用中添加定时任务功能。它支持多种触发器(日期、间隔、cron表达式),并提供了与 Flask 应用上下文集成的能力。 #### 核心概念: 1. **调度器 (Scheduler)**:任务调度核心 2. **触发器 (Trigger)**:定义任务执行规则 3. **作业存储 (Job Store)**:存储任务信息(默认内存) 4. **执行器 (Executor)**:控制任务执行方式(默认线程池) #### 基本使用示例: ```python from flask import Flask from flask_apscheduler import APScheduler app = Flask(__name__) scheduler = APScheduler() # 基础配置 class Config: SCHEDULER_API_ENABLED = True # 启用REST API SCHEDULER_TIMEZONE = "Asia/Shanghai" # 设置时区 app.config.from_object(Config) scheduler.init_app(app) scheduler.start() # 定时任务示例 @scheduler.task("interval", id="job1", seconds=10) def interval_job(): print("每10秒执行一次的任务") @scheduler.task("cron", id="job2", hour=12) def cron_job(): print("每天中午12点执行的任务") if __name__ == "__main__": app.run() ``` #### 代码详解: 1. **初始化配置**: ```python class Config: SCHEDULER_API_ENABLED = True # 启用API管理接口 SCHEDULER_TIMEZONE = "Asia/Shanghai" # 必须设置时区 JOBS = [ # 可选:通过配置声明任务 { "id": "job3", "func": "module:function_name", "trigger": "cron", "day_of_week": "0-4", "hour": 9 } ] ``` 2. **任务注册方式**: - **装饰器注册**: ```python @scheduler.task("interval", id="cleanup", hours=1) def cleanup_task(): # 每小时清理临时文件 ``` - **add_job 方法**: ```python def backup_database(): # 数据库备份逻辑 scheduler.add_job( id="db_backup", func=backup_database, trigger="cron", day_of_week="sun", hour=2 ) ``` 3. **触发器类型**: - **interval**(间隔触发): ```python scheduler.add_job( func=heartbeat, trigger="interval", minutes=5, start_date="2024-01-01 00:00:00" ) ``` - **cron**(类Unix cron表达式): ```python scheduler.add_job( func=generate_report, trigger="cron", day="last fri", hour=18, minute=30 ) ``` - **date**(单次执行): ```python scheduler.add_job( func=send_reminder, trigger="date", run_date="2024-12-31 23:59:59" ) ``` 4. **访问应用上下文**: ```python @scheduler.task("interval", minutes=30) def task_with_context(): with scheduler.app.app_context(): from flask import current_app current_app.logger.info("使用应用上下文的任务") ``` #### 常见问题解决方案: 1. **多进程问题**: ```python # 在工厂函数中初始化 def create_app(): app = Flask(__name__) if not app.debug or os.environ.get("WERKZEUG_RUN_MAIN") == "true": scheduler = APScheduler() scheduler.init_app(app) scheduler.start() return app ``` 2. **持久化存储**(使用SQLite): ```python app.config["SCHEDULER_JOBSTORES"] = { "default": SQLAlchemyJobStore(url="sqlite:///jobs.sqlite") } ``` 3. **API 端点**(启用后可用): - `GET /scheduler/jobs` - 列出所有任务 - `POST /scheduler/jobs` - 添加新任务 - `GET /scheduler/jobs/<job_id>` - 获取任务详情 - `DELETE /scheduler/jobs/<job_id>` - 删除任务 #### 最佳实践: 1. 任务函数保持幂等性 2. 长时间任务使用后台队列(如 Celery) 3. 生产环境使用持久化存储 4. 通过 `try/except` 捕获任务异常 5. 使用 `max_instances` 限制并发: ```python @scheduler.task("interval", seconds=10, max_instances=1) def resource_intensive_task(): # 确保同一时间只有一个实例运行 ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值