如何使用 python 烧瓶防止 230 秒 azure 网关超时以进行长时间运行的工作负载

Posted

技术标签:

【中文标题】如何使用 python 烧瓶防止 230 秒 azure 网关超时以进行长时间运行的工作负载【英文标题】:How to prevent the 230 seconds azure gateway timeout using python flask for long running work loads 【发布时间】:2022-01-12 09:12:19 【问题描述】:

我有一个 python 烧瓶应用程序作为 azure web 应用程序,一个功能是计算密集型工作负载,需要 5 多分钟才能处理,是否有任何黑客可以通过保持 TCP 连接之间的活动来防止网关超时错误函数处理数据时的客户端和api?当前代码示例如下。

from flask import Flask

app = Flask(__name__)

@app.route('/data')
def data():
    mydata = super_long_process_function()
    # takes more than 5 minutes to process
    return mydata 

由于 super_long_process_function 需要超过 5 分钟,它总是超时并出现 504 Gateway Time-out。我要提到的一件事是,这是 TCP 级别的空闲超时,这意味着如果连接只是空闲并且没有发生数据传输,那么只有这个超时才会被命中。那么在我们处理数据时,flask 中是否有任何黑客可以用来防止这种超时,因为根据我的研究和阅读 Microsoft 文档,无法更改 Web 应用程序的 230 秒限制。

【问题讨论】:

【参考方案1】:

简而言之:正如您所说,230 秒超时,无法更改

230 秒是请求在不将任何数据发送回响应的情况下可以花费的最长时间。不可配置。

来源:GitHub issue

超时发生在没有响应。保持连接打开并发送数据无济于事。

有几种方法可以解决这个问题。以下是另外两种可能的解决方案,您可以使用它们来触发长时间运行的任务,而不会出现超时问题。

    仅通过 HTTP 调用触发长时间运行的任务,但在返回响应之前不要等待它们完成。 使用Storage Queues 或Service Bus 等消息传递机制触发任务。

要使用长时间运行任务的结果更新 Web 应用程序,请考虑让响应包含一个 URL,前端可以调用以定期检查任务完成情况,您的请求具有一个回调 URL,以便在任务完成时调用已完成或实施Azure Web PubSub 以向客户端发送状态更新。

【讨论】:

以上是关于如何使用 python 烧瓶防止 230 秒 azure 网关超时以进行长时间运行的工作负载的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 mysql 验证烧瓶/python 中的凭据?

jQuery ajaxForm uploadProgress 防止烧瓶 render_template

如何在使用 Python 和烧瓶时找到 HTML 单选按钮的值?

如何防止flask-sqlalchemy中的双重数据提交

你如何序列化一个python烧瓶变量?

如何在python烧瓶中获取具有本地时区的模板文件的修改日期