我有一个flask REST端点,它执行一些cpu密集型的图像处理,需要几秒钟才能返回。通常,这个端点会被调用,然后被客户端中止。在这种情况下,我想取消处理。我怎么能在烧瓶里做这个?
在node.js中,我将执行以下操作:
req.on('close', function(){
//some handler
});
我希望flask有类似的东西,或者同步方法(request.I s closed()),我可以在处理过程中的某些点进行检查,如果它关闭了,就返回,但找不到。
我想发送一些东西来测试连接是否仍处于打开状态,并在连接失败时捕获异常,但Flask似乎缓冲了所有输出,因此在处理完成并尝试返回结果之前不会引发异常:
An established connection was aborted by the software in your host machine
如果客户端中止请求,我如何在中途取消处理?
有一个潜在的。。。你的问题的拙劣的解决办法。Flask has the ability to stream content back to the user via a generator。黑客的部分是将空白数据流作为检查,看看连接是否仍然打开,然后当你的内容完成,生成器可以产生实际的图像。生成器可以检查处理是否完成,如果没有完成,则返回
None
或""
或其他内容。我不知道如果客户端关闭连接,会有什么异常,但我敢打赌它是
error: [Errno 32] Broken pipe
我正试图在一个项目中做同样的事情,我发现在我的uWSGI和nginx堆栈中,当客户端的流响应被中断时,发生了以下错误
我可以用一个普通的
try
和except
像下面这样这给了我:
据我所知,您不知道在执行期间客户端是否关闭了连接,因为服务器在执行期间没有测试连接是否打开。我知道您可以在Flask应用程序中创建自定义的
request_handler
,以检测在处理请求后连接是否“断开”。例如:
也许您需要进一步研究,当请求到来时,您的自定义
request_handler
被创建,您可以在__init__
中创建一个线程,该线程每秒检查连接的状态,当它检测到连接已关闭(check this thread)时,停止图像处理。但我觉得这有点复杂:(。相关问题 更多 >
编程相关推荐