如何将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烧瓶函数的执行限制为单个实例的主要内容,如果未能解决你的问题,请参考以下文章

使用烧瓶逐步展示演示

从烧瓶应用程序调用 python 函数

Python。烧瓶。点击后获取列表[重复]

Python -- 面向对象编程类和实例访问限制

如何在烧瓶模型中定义函数并将其用于变量

Celery Beat:一次限制为单个任务实例