apscheduler Flask中执行两次[重复](apscheduler in Flask ex

2019-07-19 20:57发布

这个问题已经在这里有一个答案:

  • 为什么运行瓶开发服务器运行本身两次? 4个回答

我当我在我的烧瓶应用程序中使用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

Answer 1:

在调试模式下,瓶的reloader将加载瓶应用两次( 如何在调试模式初始化两次停止瓶? )。 我不知道这是为什么,但它会导致apscheduler的工作要安排两次。 快速print "loaded scheduler"前右sched.start()证实了这一点。

周围有这样的几种方法,如链接答复中提到。 一个我发现最好的工作仅仅是禁用,像这样的reloader:

app.run(use_reloader=False)

这意味着我必须重新加载我的应用程序手动,因为我开发它,但它是一个很小的代价获得apscheduler工作。



Answer 2:

当使用reloader,有主机和子进程。 您的调度线程上同时运行。 您需要防止调度从主进程中运行

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


Answer 3:

你可以开始在瓶的调度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())

需要注意的是before_first_request()将始终与服务器重装后的第一个请求再次调用。



Answer 4:

我做到了,我在add_interval_job参数补充一定的时间点之后开始

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


Answer 5:

最好解决方案是使用add_cron_job('*')而不是add_interval_job('*')



文章来源: apscheduler in Flask executes twice [duplicate]