Flask:当用户在执行一个长进程时关闭浏览器时会发生什么?

Flask: What happens when a user closes the browser while a long process is being executed?

情况如下:

我有一个应用程序,它使用 Angularjs 作为前端,使用 Flask 作为后端。

我的路线如下:

@app.route('/api/route1', methods=['POST'])
def route1():
    result = some_package.long_task()
    result2 = some_package.short_task(result)
    return jsonify(result)

long_task函数正在使用check_output执行一些bash命令,使用数据库,读写文件等等。可能需要几个小时才能完成。

假设用户厌倦了等待并在进程开始 10 分钟后关闭浏览器window。

我的问题是:

非常感谢您的回答。

  1. Will both long_task and short_task will be executed anyway?

是的,他们会的。 Flask 不知道客户端是否关闭了连接。

  1. Is it possible that this situation creates any memory leakage?

是的,但这仅取决于您在 long_task 和 short_task 中的代码。即使没有连接抛出,也可能发生内存泄漏。您可以写入记录请求前后分配的内存之间的差异。

  1. Is it possible to know that the user closed the browser at some point? (including when I try to return the response: would it be possible to know that the response wasn't delivered?) Does the answer of this question depends on what server am I using? (Tornado, uWSGI...)

简单的回答 - 不。但它可以通过某种黑客攻击来完成,在执行 long_task 时流式传输空响应并捕获异常,如果客户端关闭连接,该异常将被断言。

您可以在这里阅读:Stop processing Flask route if request aborted