我当我在我的烧瓶应用程序中使用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
在调试模式下,瓶的reloader将加载瓶应用两次( 如何在调试模式初始化两次停止瓶? )。 我不知道这是为什么,但它会导致apscheduler的工作要安排两次。 快速print "loaded scheduler"
前右sched.start()
证实了这一点。
周围有这样的几种方法,如链接答复中提到。 一个我发现最好的工作仅仅是禁用,像这样的reloader:
app.run(use_reloader=False)
这意味着我必须重新加载我的应用程序手动,因为我开发它,但它是一个很小的代价获得apscheduler工作。
当使用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()
你可以开始在瓶的调度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()
将始终与服务器重装后的第一个请求再次调用。
我做到了,我在add_interval_job参数补充一定的时间点之后开始
sched.add_interval_job(test_scheduler, seconds=5, start_date='2013-02-13 00:00')
最好解决方案是使用add_cron_job('*')
而不是add_interval_job('*')