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
相关产品推荐
相关产品推荐

