我在烧瓶应用程序中使用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 测试 1360844314.2
答案 0 :(得分:38)
在调试模式下,Flask的重新加载器将加载烧瓶应用程序两次(How to stop Flask from initialising twice in Debug Mode?)。我不确定为什么会这样,但它导致apscheduler的工作安排两次。在print "loaded scheduler"
之前快速sched.start()
确认此事。
如链接答案中所述,有几种方法可以解决这个问题。我发现效果最好的就是像这样禁用重新加载器:
app.run(use_reloader=False)
这意味着我必须在开发时手动重新加载我的应用程序,但要让计划程序正常工作,这是一个很小的代价。
答案 1 :(得分:24)
使用重新加载器时,有主进程和子进程。您的调度程序线程同时运行。您需要阻止调度程序在主进程中运行
if not app.debug or os.environ.get('WERKZEUG_RUN_MAIN') == 'true':
sched = Scheduler()
sched.add_interval_job(test_scheduler, seconds=5)
sched.start()
答案 2 :(得分:8)
您可以在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())
请注意,在服务器重新加载后,第一个请求将始终再次调用before_first_request()
。
答案 3 :(得分:0)
我已经做到了,我在add_interval_job参数中添加了一段时间后启动
sched.add_interval_job(test_scheduler, seconds=5, start_date='2013-02-13 00:00')
答案 4 :(得分:-1)
最佳解决方案是使用add_cron_job('*')
代替add_interval_job('*')