我目前在Flask应用程序中有一个路由,它从外部服务器提取数据,然后将结果推送到前端。外部服务器偶尔速度较慢或没有响应。在路由调用上设置超时的最佳方法是什么,这样在外部服务器滞后时前端就不会挂起?或者在Flask中有没有更合适的方法来处理这种情况(而不是Apache、nginx等)?
我的目标是暂停路由调用,而不是让任意长进程保持活动状态,就像这个SO问题:chrome和flask的超时问题。像websocket这样的选项运行后台进程/线程,直到它们完成;但是,我想在经过一定时间后停止慢速路由呼叫。类似于函数调用上的Timeout和Python Timeout,但在Flask上下文中。Celery的任务装饰器(使用Python、Flask和Celery的并发异步进程)似乎是一个很好的解决方案,但我不想只使用它的少量功能就需要很大的依赖性。
不完全确定我对这一切是否正确,但我的理解是,如果处理请求的线程(或绿线程)在自己的"前台"进行网络调用,并且该调用超时,那么很可能会发生borken管道。但是,您可以做的是派生出一个完全独立的线程来处理网络请求,然后在请求处理代码中调用thread.join()并超时。
http://docs.python.org/2/library/threading.html#threading.Thread.join
此时,调用Thread.isAlive()(仍在您的请求处理代码路径中),如果为True,则网络调用没有及时返回,您将返回错误状态。
如果它是False,并且您需要让"worker"线程用响应数据更新一些(线程安全的)数据结构,那么您就可以获得响应数据并继续前进。