4

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

我的目标是让路由调用超时,而不是像这个 SO 问题那样保持任意长时间的进程:Time out issues with chrome and flask。像 websockets 这样的选项会运行后台进程/线程,直到它们完成;但是,我想在经过一段固定的时间后停止慢速路由呼叫。就像函数调用上的超时和Python 超时一样,但在 Flask 上下文中。Celery 的任务装饰器(使用 Python、Flask 和 Celery 的并发异步进程)似乎是一个很好的解决方案,但我不希望需要大量依赖来仅使用其少量功能。

4

1 回答 1

2

不完全确定我对这一切是否正确,但我的理解是,如果处理请求的线程(或 greenthread)在它自己的“前台”中进行网络调用,并且该调用超时,那么 borken 管道几乎将要发生。但是你可以做的是分拆一个完全独立的线程来处理网络请求,然后在你的请求处理代码中调用 Thread.join() 并超时。

http://docs.python.org/2/library/threading.html#threading.Thread.join

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

如果它是 False - 你需要让“工作”线程使用响应数据更新一些(线程安全的)数据结构 - 你得到响应数据并继续你的方式。

于 2013-08-10T17:39:43.090 回答