当前位置: 首页 > 知识库问答 >
问题:

Flask中的ap调度程序执行两次[重复]

车辰龙
2023-03-14

我在烧瓶应用程序中使用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()每五秒钟执行两次

测试1360844314.01测试1360844314.2

共有3个答案

钱飞翼
2023-03-14

您可以在Flask的before\u first\u request()decorator中启动调度程序,该decorator“在应用程序的这个实例的第一个请求之前注册要运行的函数”。

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\u first\u request()

颛孙霖
2023-03-14

使用重新加载程序时,有主进程和子进程。您的调度程序线程在这两者中都运行。您需要防止调度程序在主进程中运行

if not app.debug or os.environ.get('WERKZEUG_RUN_MAIN') == 'true':
  sched = Scheduler()
  sched.add_interval_job(test_scheduler, seconds=5)
  sched.start()
崔高远
2023-03-14

在调试模式下,Flask的重新加载程序将加载Flask应用程序两次(如何阻止Flask在调试模式下初始化两次?)。我不确定这是为什么,但它会导致apscheduler的作业被调度两次。一个快速打印“加载的调度程序”就在调度之前。start()确认了这一点。

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

app.run(use_reloader=False)

这意味着我必须在开发应用程序时手动重新加载它,但要让apscheduler正常工作,付出的代价很小。

 类似资料:
  • 我有一个使用Quartz1.6.6的Java应用程序。它被部署到Weblogic上,Weblogic的体系结构包括两个应用服务器。 令人困惑的是,我有另一个Java应用程序,其中包含了Quartz调度,它似乎运行得非常愉快。另一个应用程序有一个相同的机制,每分钟触发一个触发器,从日志中我可以看到该作业每60秒只运行一次。 昨天下午作业已运行的次数示例: 15:10:46,984 15:10:49,

  • 从HomeActivity我正在尝试从CreateProfileActivity获取结果。在这里我要做什么来开始这个活动 以下是HomeActivity中方法的实现: 当im完成并按下save in后,下面是我将数据发送回HomeActivity的操作: 在上调用setResult方法一次,但由于某种未知原因,当数据到达方法时,get execute两次。第一个结果的和第二个结果的。在此之后,得到

  • 15.2 仅执行一次的工作调度 首先,我们先来谈谈单一工作调度的运行,那就是 at 这个指令的运行! 15.2.1 atd 的启动与 at 运行的方式 要使用单一工作调度时,我们的 Linux 系统上面必须要有负责这个调度的服务,那就是 atd 这个玩意儿。 不过并非所有的 Linux distributions 都默认会把他打开的,所以呢,某些时刻我们必须要手动将他启用才行。 启用的方法很简单,

  • 在一个项目中,我们必须运行一个定期开始的作业(现在QA env上每5分钟开始一次),该作业处理40K用户的一些任务。我们决定使用Spring Batch,因为它非常适合,并且几乎用默认配置实现了它(例如,它使用)。好的,有一个工作由一个步骤组成: 开箱即用 在内存中执行轻量级计算的自定义 自定义,它通过多个JPQL和本机查询将数据保存到同一个PostgreSQL db。 作业本身是用调度的,并且每

  • 我正在使用Quartz调度器,但我不知道如何并行运行作业。配置文件中有什么东西可以允许我这样做吗?

  • 我需要以下方面的帮助:我正在javafx中实现一个应用程序,这个应用程序是通过单击按钮调用的。问题是当我关闭应用程序时,我不能再次调用它。我读到过你不能多次调用Application.launch()方法。但是我在服务类上发现了一些东西。留档页面中的示例不是很清楚。有人知道如何做到这一点吗?谢谢。 http://docs.oracle.com/javafx/2/threads/jfxpub-thr