我有一个在后端运行的烧瓶应用程序,并通过某些端点向客户端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分钟将客户端从客户端发布到另一个标志,以使后端知道有一个客户在等待响应。但是也许我忽略了一个更优雅的解决方案。
我并不是真正的后端,但是我需要解决这个问题。那么,您还能建议我其他选择吗?要读的东西?还是您知道是否有好习惯面对这个?
您想要的不容易。通常,解决方案是不要打扰并使请求在后台运行并与之相处。最后,大多数请求可能不会被"取消",因此开发此类解决方案的开销大于较小的好处。
如果您的任务确实是长期运行的(我的意思是几分钟甚至更多),那么您应该将它们卸载到芹菜任务之类的东西中。在这种情况下,您可以保留对任务ID的参考并撤销该任务(通过terminate=True
也应该处理已经运行的任务)。