Flask中的apscheduler执行两次

bek*_*eka 34 python flask apscheduler

我在烧瓶应用程序中使用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()
Run Code Online (Sandbox Code Playgroud)

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

测试1360844314.01测试1360844314.2

Ken*_*ker 43

在调试模式下,Flask的重新加载器将加载烧瓶应用程序两次(如何在调试模式下停止Flask初始化两次?).我不确定为什么会这样,但它会导致apscheduler的工作安排两次.print "loaded scheduler"sched.start()确认之前快速右键.

如链接答案中所述,有几种方法可以解决这个问题.我发现效果最好的只是禁用重新加载器,如下所示:

app.run(use_reloader=False)
Run Code Online (Sandbox Code Playgroud)

这意味着我必须在开发时手动重新加载我的应用程序,但要让apscheduler工作是一个很小的代价.


cha*_*101 27

使用重新加载器时,有主进程和子进程.您的调度程序线程同时运行.您需要阻止调度程序在主进程中运行

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

  • 您可以将 `DEBUG = True` 设置为 Config 对象。在这种情况下,“app”对象知道“app.run()”之前的状态,这对我来说就像一个魅力。 (2认同)

tuo*_*tik 11

您可以在Flask的before_first_request()装饰器中启动调度程序,它" 在第一次请求此应用程序实例之前注册要运行的函数 ".

import time
import atexit

from apscheduler.schedulers.background import BackgroundScheduler


def print_date_time():
    print(time.strftime("%A, %d. %B %Y %I:%M:%S %p"))


@app.before_first_request
def init_scheduler():
    scheduler = BackgroundScheduler()
    scheduler.add_job(func=print_date_time, trigger="interval", seconds=3)
    scheduler.start()
    # Shut down the scheduler when exiting the app
    atexit.register(lambda: scheduler.shutdown())
Run Code Online (Sandbox Code Playgroud)

请注意,before_first_request()在服务器重新加载后,将始终使用第一个请求再次调用.


bek*_*eka -3

我已经做到了,我添加了 add_interval_job 参数以在某个时间点后开始

sched.add_interval_job(test_scheduler, seconds=5, start_date='2013-02-13 00:00')
Run Code Online (Sandbox Code Playgroud)