我目前在 Flask 应用程序中有一条路线,可以从外部服务器提取数据,然后将结果推送到前端。外部服务器偶尔会缓慢或无响应。在路由调用上设置超时的最佳方法是什么,以便在外部服务器滞后时前端不会挂起?或者在 Flask 中是否有更合适的方法来处理这种情况(而不是 Apache、nginx 等)?
我的目标是使路由调用超时,not保持任意长进程存活,就像这样的问题:chrome 和 Flask 的超时问题 https://stackoverflow.com/questions/18127128/time-out-issues-with-chrome-and-flask。像 websockets 这样的选项会运行后台进程/线程,直到它们完成;但是,我想在经过一段固定时间后停止慢速路由调用。喜欢函数调用超时 https://stackoverflow.com/questions/492519/timeout-on-a-python-function-call and Python超时 https://stackoverflow.com/questions/811692/python-timeout但在 Flask 上下文中。 Celery 的任务装饰器(使用 Python、Flask 和 Celery 的并发异步进程 https://stackoverflow.com/questions/14588253/concurrent-asynchronous-processes-with-python-flask-and-celery)似乎是一个很好的解决方案,但我不想需要很大的依赖来仅使用其少量功能。
不完全确定我对这一切是否正确,但我的理解是,如果处理请求的线程(或 greenthread)在它自己的“前台”中进行网络调用,并且该调用超时,则 borken 管道几乎是将要发生。但是您可以做的是分出一个完全独立的线程来执行网络请求,然后在请求处理代码中调用 Thread.join() 并设置超时。
http://docs.python.org/2/library/threading.html#threading.Thread.join http://docs.python.org/2/library/threading.html#threading.Thread.join
此时,调用 Thread.isAlive() (仍在请求处理代码路径中),如果为 True,则网络调用未及时返回,并且您将返回错误状态。
如果它是 False - 并且您需要让“工作”线程使用响应数据更新一些(线程安全)数据结构 - 您将获得该响应数据并继续您的方式。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)