Flask中apscheduler执行两次

60 投票
5 回答
45711 浏览
提问于 2025-04-17 15:52

我在我的Flask应用程序中使用apscheduler时遇到了问题。

在我的view.py文件中,我是这样写的:

import time
from apscheduler.scheduler import Scheduler

def test_scheduler():
     print "TEST"
     print time.time()


sched = Scheduler()
sched.add_interval_job(test_scheduler, seconds=5)
sched.start()

然后这个方法test_scheduler()每五秒钟执行两次。

测试结果是:

TEST
1360844314.01
TEST
1360844314.2

5 个回答

57

在使用重载器的时候,会有一个主进程和一个子进程。你的调度线程会在这两个进程中运行。你需要确保调度线程不会在主进程中运行。

if not app.debug or os.environ.get('WERKZEUG_RUN_MAIN') == 'true':
  sched = Scheduler()
  sched.add_interval_job(test_scheduler, seconds=5)
  sched.start()
86

在调试模式下,Flask的重载功能会让Flask应用加载两次(如何防止Flask在调试模式下初始化两次?)。我不太清楚为什么会这样,但这导致apscheduler的任务被安排了两次。在sched.start()之前加个print "loaded scheduler"可以确认这一点。

有几种方法可以解决这个问题,正如链接中的答案所提到的。我发现最有效的方法就是像这样禁用重载功能:

app.run(use_reloader=False)

这意味着在开发过程中我需要手动重新加载我的应用,但为了让apscheduler正常工作,这点小麻烦是值得的。

-3

我做到了,我添加了一个叫做 add_interval_job 的参数,这样可以在某个特定时间点之后开始。

sched.add_interval_job(test_scheduler, seconds=5, start_date='2013-02-13 00:00')

撰写回答