如何将python烧瓶函数的执行限制为单个实例
Posted
技术标签:
【中文标题】如何将python烧瓶函数的执行限制为单个实例【英文标题】:How to limit execution of python flask function to single instance 【发布时间】:2022-01-08 15:34:58 【问题描述】:我有一个生成速度极慢的 Python Flask 页面。从外部API拉取所有数据大约需要1分钟,在返回页面之前处理数据。幸运的是,数据的有效期最长为 1 小时,因此我可以缓存结果并为大多数请求快速返回缓存的结果。
这很好用,除了缓存过期后的那一分钟。如果单分钟内有 10 次请求,就会有 10 次调用 veryslowpage() 函数,这会因为外部 API 调用而吃掉 HTTPS 连接池,因为数据处理会吃掉内存,影响站点上的其他页面.有没有办法将此函数限制为单个实例,因此 10 个请求将导致只有 1 次调用 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)
【问题讨论】:
【参考方案1】:您可以简单地创建一个函数,定期从 API 获取数据(每小时)并将其存储在您的数据库中。然后在你的路由函数中从你的数据库而不是外部 API 中读取数据。
更好的方法是创建一个非常简单的脚本并在您的 app/init.py 中调用它(在另一个线程中),每隔一小时获取数据并更新数据库。
【讨论】:
【参考方案2】:您可以创建一个文件或数据库条目,其中包含您在不同线程中计算响应的信息。然后,您的方法将检查此类文件是否存在,如果存在,则让它等待并定期检查响应。
您还可以每小时(或每 59 分钟,如果重要的话)主动创建一次数据,这样您就可以随时获得新的响应。您可以为此使用 APScheduler 之类的东西。
【讨论】:
以上是关于如何将python烧瓶函数的执行限制为单个实例的主要内容,如果未能解决你的问题,请参考以下文章