使用Flask,SQLAlchemy,我正在制作一个网站,并且具有汇总股票价格的功能。我想使用APScheduler将数据保存在Postgres中。但我也希望它从停下来的地方开始。
由于服务器仅在本地计算机上,因此它并不总是在运行。如果我在星期三的星期三关闭它,并在星期一重新打开它,我希望它立即从星期三获取并保存数据。
根据APScheduler的文档,我认为只要服务器始终在运行,此功能就应该运行。
from apscheduler.schedulers.background import BackgroundScheduler
scheduler = BackgroundScheduler()
def save_stock_price():
"""save stock prices to psql db"""
tickers = all_tickers()
stock_prices = fetch_all(tickers)
data = StockPrice(data=stock_prices)
try:
data.save() # runs db.session.add(self), db.session.commit()
except (KeyError, RuntimeError):
pass
def schedule_stock_price(scheduler):
"""1600, weekdays"""
scheduler.add_job(id='Scheduled task3',
func=save_stock_price,
trigger='cron',
day_of_week='mon-fri',
hour='16',
minute=1,
timezone='EST'
)
try:
scheduler.start()
except (KeyboardInterrupt, SystemExit):
pass
schedule_stock_price(scheduler)
但是设置为在工作日每天一次,以16:01运行。
如何使它从停下来的地方捡起并填补空白?
从设计模式的角度来看,您可能是从错误的角度来解决这个问题。计划的作业是无状态的,因为它要么“应该在此刻运行”,否则不应。为了使其“填补空白”,您将不得不引入另一个过程。如果有第二个计划任务,其主要工作是确定是否有几天缺少数据,然后出去然后取数据,该怎么办?一个简化的过程可能是这样的