Python 对无响应烧瓶路由的调用设置超时(已更新)

Python 对无响应烧瓶路由的调用设置超时(已更新),python,events,concurrency,flask,celery,Python,Events,Concurrency,Flask,Celery,我目前在Flask应用程序中有一个路由,它从外部服务器提取数据,然后将结果推送到前端。外部服务器有时速度慢或无响应。在路由调用上设置超时的最佳方法是什么,这样在外部服务器滞后时前端不会挂起?或者有没有更合适的方法在Flask中处理这种情况(不是Apache、nginx等) 我的目标是使路由调用超时,而不是使任意长进程保持活动状态,如以下问题:。WebSocket等选项运行后台进程/线程,直到它们完成;但是,我想在经过一定时间后停止慢速路由呼叫。类似于,但在烧瓶上下文中。芹菜的任务装饰器()似乎是

我目前在Flask应用程序中有一个路由,它从外部服务器提取数据,然后将结果推送到前端。外部服务器有时速度慢或无响应。在路由调用上设置超时的最佳方法是什么,这样在外部服务器滞后时前端不会挂起?或者有没有更合适的方法在Flask中处理这种情况(不是Apache、nginx等)


我的目标是使路由调用超时,而不是使任意长进程保持活动状态,如以下问题:。WebSocket等选项运行后台进程/线程,直到它们完成;但是,我想在经过一定时间后停止慢速路由呼叫。类似于,但在烧瓶上下文中。芹菜的任务装饰器()似乎是一个很好的解决方案,但我不想要求一个大的依赖项只使用它的少量功能

我不完全确定我对这一切的看法是否正确,但我的理解是,如果处理请求的线程(或绿色线程)在其自己的“前台”进行网络调用,并且该调用超时,那么borken管道几乎将发生。但是您可以做的是剥离一个执行网络请求的完全独立的线程,然后在请求处理代码中调用thread.join()

此时,调用Thread.isAlive()(仍在请求处理代码路径中),如果为True,则网络调用没有及时返回,您将返回错误状态


如果它是错误的-并且您需要让“工作者”线程用响应数据更新一些(线程安全的)数据结构-您将获得响应数据并继续运行。

您的应用程序是如何提供的?这就是阻塞行为发生的地方,最好的方法取决于运行flask的东西,而不是flask本身的任何东西。我实际上并没有遇到任何阻塞问题,因为所有调用都是异步的。我有时会遇到死机,对ajax调用设置超时会导致Flask抛出断管错误。呃,为什么您认为这些调用是异步的?如果是这样的话,你就不应该受到死亡的折磨。有点不清楚问题是什么-你是在试图避免管道破裂的问题,优雅地处理管道破裂的事情,还是避免死亡的旋转?你在gunicorn上使用什么工人阶级?事实上,您可以包含整个gunicorn cmdline吗?我的目标是在内容从后端异步加载时显示微调器(目前是这样)。如果外部请求花费的时间太长,我想通知前端它无法完成请求。当前,当internet连接变慢或变慢时,Flask会无限期地等待外部服务器的响应。因为这一切都是异步进行的,所以web应用程序的其余部分仍然运行良好(没有阻塞),我只希望前端能够正确显示正在发生的事情。我还没有在边缘情况下测试过这一点,但它在更一般的情况下运行良好。