You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python/Flask定时事件配置页开发:实现网页控制定时任务启停

问题分析与解决方案

现有代码核心问题

  • sched.scheduler.run()是阻塞方法,直接在Flask请求路由中调用会占死请求处理线程,后续所有请求(包括停止定时器的请求)都无法被响应
  • 代码中cameraScheduler.run缺少调用括号,实际不会执行调度逻辑
  • sched模块没有全局取消所有任务的cancel()方法,取消任务需要持有对应事件的实例对象才能操作
  • Flask默认单线程处理请求,且多进程部署时全局调度器实例会被复制,任务状态无法同步

推荐解决方案

建议使用专门适配Python Web场景的定时任务库APScheduler,搭配Flask-APScheduler扩展实现需求,该方案支持后台非阻塞运行、任务启停控制,和Flask适配性好。

依赖安装

pip install flask flask-apscheduler

完整实现代码

from flask import Flask, render_template, request
from flask_apscheduler import APScheduler

app = Flask(__name__)
# 初始化后台调度器
scheduler = APScheduler()
scheduler.init_app(app)
scheduler.start()

# 定时执行的任务
def trigger_camera():
    print('Picture Taken')

@app.route('/', methods = ['POST','GET'])
def settings():
    if request.method == 'POST':
        timer_enable = request.form.getlist('timer') == ['true']
        # 先判断任务是否已存在
        task_exist = scheduler.get_job(id='camera_task') is not None
        if timer_enable:
            if not task_exist:
                # 添加间隔5秒执行的任务,id唯一标识任务
                scheduler.add_job(id='camera_task', func=trigger_camera, trigger='interval', seconds=5)
        else:
            if task_exist:
                # 根据任务id删除/暂停任务
                scheduler.remove_job(id='camera_task')
    return render_template("settings.html")

if __name__ == '__main__':
    # 开发环境避免Flask重载时启动两次调度器
    app.run(use_reloader=False)

注意事项

  • 生产环境使用多进程部署(如Gunicorn、uWSGI)时,需要配置调度器仅在主进程启动,避免多进程重复执行任务,可通过判断进程id等方式实现
  • 如果需要临时暂停任务而非删除,可调用scheduler.pause_job('camera_task')和scheduler.resume_job('camera_task')实现

内容的提问来源于stack exchange,提问作者NotGene

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 11:39:02