Flask中apscheduler执行两次
我在我的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')