我有一个Python Flask页面,它的生成速度非常慢。从外部API拉取所有数据,在返回页面之前对数据进行处理,大约需要1分钟。幸运的是,数据的有效期长达1小时,所以我可以缓存结果,并为大多数请求快速返回缓存的结果。
除了缓存过期后的那一分钟之外,它工作得很好。如果在这一分钟内发出了10个请求,那么将有10个对veryslowpage()函数的调用,这会由于外部API调用而耗尽HTTPS连接池,并由于数据处理而耗尽内存,从而影响站点上的其他页面。有没有一种方法可以将这个函数限制在单个实例中,这样10次请求只会导致对veryslowpage()的一次调用,而其余的则会等待缓存的结果准备就绪?
from flask import Flask, request, abort, render_template
from flask_caching import Cache
@app.route('/veryslowpage', methods=['GET'])
@cache.cached(timeout=3600, query_string=True)
def veryslowpage():
data = callexternalAPIs()
result = heavydataprocessing(data)
return render_template("./index.html", content=result)发布于 2021-12-02 08:04:40
您可以创建一个文件或数据库条目,其中包含您在不同线程中计算响应的信息。然后,您的方法将检查这样的文件是否存在,如果存在,让它等待并定期检查响应。
您还可以每小时主动创建一次数据(如果重要,则每59分钟创建一次),这样您就可以始终获得最新的响应。你可以使用像APScheduler这样的东西来做这件事。
发布于 2021-12-02 08:11:27
您可以简单地创建一个函数,该函数定期(每小时)从API获取数据并将其存储在数据库中。然后,在路由函数中,从数据库读取数据,而不是从外部API读取数据。
一种更好的方法是创建一个非常简单的脚本,并在app/init.py中调用它(在另一个线程中),该脚本每隔一小时获取数据并更新数据库。
https://stackoverflow.com/questions/70194449
复制相似问题