首页 > 解决方案 > 从基于 Web 的客户端取消 Flask 后端进程

问题描述

我有一个在后端运行的 Flask 应用程序,并通过一些端点将一些数据传递给客户端 Web 应用程序。例如

@app.route('/extract_entities_from_matching_docs', methods=['POST'])
def extract_entities_from_matching_docs():
   data = request.form
   entities = storage.get_entities_in_docs_by_keywords(data[“keywords”])
   return jsonify(entities)

这只是一个例子,但问题是,有时这类方法需要花费太多时间来处理,用户可能希望从客户端取消处理(例如,假设您在客户端上有一个“取消”按钮)。

我的问题是:如何从前端取消后端正在运行的进程?我想我可能会在循环中包含一个标志,所以如果标志设置为 true,它会继续循环和处理,否则,它只会返回。但是这样一个简单的替代方案的问题是:如果客户端只是关闭浏览器的选项卡怎么办?该进程将继续在后端运行,没有理由这样做。也许通过每隔 x 分钟从客户端发布到另一个标志,以使后端知道有一个客户端在等待响应。但也许我忽略了一个更优雅的解决方案。

我并没有真正进入后端,但我需要解决这个问题。那么,你能建议我其他的选择吗?有什么要读的吗?或者你知道是否有任何好的做法来面对这个?

标签: pythonpython-3.xflaskpython-requests

解决方案


你想要的东西是不容易实现的。通常,解决方案是不要打扰并保持请求在后台运行,而只是忍受它。最后,大多数请求可能不会被“取消”,因此开发这种解决方案的开销超过了微小的好处。

如果您的任务真的很长时间运行(我的意思是几分钟甚至更多),那么您应该将它们卸载到诸如 Celery 任务之类的东西上。在这种情况下,您可以保留对任务 ID 的引用并撤销它(传递terminate=True也应该处理已经运行的任务)。


推荐阅读