【发布时间】:2020-07-08 09:25:38
【问题描述】:
我们正在使用fastapi-utils 在后台执行计划任务。如果数据库中有新数据可用,我们会检查所有 5 秒,如果是,我们会处理它(最多需要 5 分钟)
在此期间,协同程序应该被阻塞,以便它只触发一次。
我们注意到我们的数据有时会被处理 3 倍,我们假设调度程序继续运行,即使函数已被触发。
因此我们尝试使用IsRunningQuery 变量来规避它。
我们尝试了一个没有 @repeat_every 的带有 while True 循环的解决方案,以使其在启动时运行一次,但 Azure Webapps 不允许运行它。
@app.on_event("startup")
@repeat_every(wait_first=True,seconds=int(10))
def scheduled_task() -> None:
global IsRunningQuery
global LastCheck
if IsRunningQuery == False:
IsRunningQuery = True
gunicorn_logger.info("status='checkforleads'")
OurProccessingClass.processDataBaseData() # can take up 5 minutes
LastCheck=Utils.datetime()
IsRunningQuery = False
此变体适用于我们的 DEV 环境,但不适用于 Azure
@app.on_event("startup")
async def scheduled_task() -> None:
while True:
gunicorn_logger.info("status='checkforleads'")
OurProccessingClass.processDataBaseData() # can take up 5 minutes
time.sleep(int(os.environ["CRM_SLEEP"]))
【问题讨论】:
标签: fastapi