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。
我的问题是:
-
long_task
和 short_task
都会被执行吗?
- 这种情况是否可能造成内存泄漏?
- 是否可以知道用户在某个时候关闭了浏览器? (包括当我尝试 return 响应时:是否有可能知道响应未送达?)
- 这个问题的答案是否取决于我使用的是什么服务器? (龙卷风、uWSGI...)
非常感谢您的回答。
- Will both long_task and short_task will be executed anyway?
是的,他们会的。 Flask 不知道客户端是否关闭了连接。
- Is it possible that this situation creates any memory leakage?
是的,但这仅取决于您在 long_task 和 short_task 中的代码。即使没有连接抛出,也可能发生内存泄漏。您可以写入记录请求前后分配的内存之间的差异。
- 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
情况如下:
我有一个应用程序,它使用 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。
我的问题是:
-
long_task
和short_task
都会被执行吗? - 这种情况是否可能造成内存泄漏?
- 是否可以知道用户在某个时候关闭了浏览器? (包括当我尝试 return 响应时:是否有可能知道响应未送达?)
- 这个问题的答案是否取决于我使用的是什么服务器? (龙卷风、uWSGI...)
非常感谢您的回答。
- Will both long_task and short_task will be executed anyway?
是的,他们会的。 Flask 不知道客户端是否关闭了连接。
- Is it possible that this situation creates any memory leakage?
是的,但这仅取决于您在 long_task 和 short_task 中的代码。即使没有连接抛出,也可能发生内存泄漏。您可以写入记录请求前后分配的内存之间的差异。
- 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