对没有响应的Flask路线的呼叫设置超时(更新)

时间:2013-08-10 17:11:50

标签: python events concurrency flask celery

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

我的目标是超时路由呼叫,保持一个任意长的进程,就像这个SO问题:Time out issues with chrome and flask。像websockets这样的选项运行后台进程/线程直到完成;但是,我希望在经过一段固定的时间后停止慢速路由呼叫。与Timeout on a function callPython Timeout类似,但在Flask上下文中。 Celery的任务装饰器(Concurrent asynchronous processes with Python, Flask and Celery)似乎是一个很好的解决方案,但我不想要求大的依赖只使用少量的功能。

1 个答案:

答案 0 :(得分:2)

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

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

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

如果它是假的 - 你需要让“工人”线程用响应数据更新一些(线程安全的)数据结构 - 你会获得响应数据并继续前进。