如何使用 python flask 长时间 运行 工作负载来防止 230 秒 azure 网关超时
How to prevent the 230 seconds azure gateway timeout using python flask for long running work loads
我有一个 python flask 应用程序作为 azure web 应用程序,其中一个功能是计算密集型工作负载,需要超过 5 分钟才能处理,是否有任何 hack 可以通过保持函数处理数据时,客户端与 api 之间的 TCP 连接处于活动状态?当前代码示例如下。
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 网关超时 。我想提及的一件事是,这是 TCP 级别的空闲超时,这意味着如果连接仅处于空闲状态并且没有数据传输发生,则只有此超时才会发生。那么在我们处理数据时,flask 中是否有任何 hack 可以用来防止超时,因为根据我的研究和阅读 Microsoft 文档,网络应用程序不能更改 230 秒限制。
简而言之:230秒的超时时间,正如你所说,无法更改。
230 seconds is the maximum amount of time that a request can take without sending any data back to the response. It is not configurable.
来源:GitHub issue
无响应超时。保持连接打开并发送数据无济于事。
您可以通过多种方式解决此问题。这里有两种可能的解决方案,您可以使用这些解决方案来触发长时间的 运行 任务,而不会出现超时问题。
- 只有 触发 具有 HTTP 调用的长 运行 任务,但在返回响应之前不要等待它们完成。
- 使用 Storage Queues or Service Bus.
等消息传递机制触发任务
为了使用长 运行 任务的结果更新 Web 应用程序,请考虑让响应保持 URL 前端可以调用以定期检查任务完成情况,您的请求具有回调 URL 以在任务完成时调用或实施 Azure Web PubSub 以向客户端发送状态更新。
我有一个 python flask 应用程序作为 azure web 应用程序,其中一个功能是计算密集型工作负载,需要超过 5 分钟才能处理,是否有任何 hack 可以通过保持函数处理数据时,客户端与 api 之间的 TCP 连接处于活动状态?当前代码示例如下。
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 网关超时 。我想提及的一件事是,这是 TCP 级别的空闲超时,这意味着如果连接仅处于空闲状态并且没有数据传输发生,则只有此超时才会发生。那么在我们处理数据时,flask 中是否有任何 hack 可以用来防止超时,因为根据我的研究和阅读 Microsoft 文档,网络应用程序不能更改 230 秒限制。
简而言之:230秒的超时时间,正如你所说,无法更改。
230 seconds is the maximum amount of time that a request can take without sending any data back to the response. It is not configurable.
来源:GitHub issue
无响应超时。保持连接打开并发送数据无济于事。
您可以通过多种方式解决此问题。这里有两种可能的解决方案,您可以使用这些解决方案来触发长时间的 运行 任务,而不会出现超时问题。
- 只有 触发 具有 HTTP 调用的长 运行 任务,但在返回响应之前不要等待它们完成。
- 使用 Storage Queues or Service Bus. 等消息传递机制触发任务
为了使用长 运行 任务的结果更新 Web 应用程序,请考虑让响应保持 URL 前端可以调用以定期检查任务完成情况,您的请求具有回调 URL 以在任务完成时调用或实施 Azure Web PubSub 以向客户端发送状态更新。