超时铬和烧瓶的问题

sed*_*idw 6 python google-chrome web-applications flask

我有一个Web应用程序,它充当异地服务器的接口,该服务器运行很长的任务.用户输入信息并点击提交,然后Chrome等待响应,并在收到新网页时加载.但是,根据网络,用户的输入,任务可能需要相当长的时间,并且偶尔会在返回数据之前加载"无数据接收页面"(尽管任务仍在运行).

有没有办法在我的任务正在思考时放置一个临时页面,或者只是强迫chrome继续等待?提前致谢

Mar*_*eth 13

虽然您可以更改服务器上的超时或其他技巧以尝试保持页面"活动",但请记住,您可能无法控制的连接的其他部分可能会使请求超时(例如超时)浏览器的值,或浏览器和服务器之间的任何代理等).此外,如果任务需要更长时间才能完成,您可能需要不断提高超时值(变得更高级,或者因为更多人使用它而变慢).

最后,通常会通过更改架构来解决此类问题.

对长时间运行的任务使用单独的进程

视图不是在处理视图中提交请求并运行任务,而是在单独的进程中启动任务的运行,然后立即返回响应.此响应可以使用户进入"请稍候,我们正在处理"页面.该页面可以使用众多推送技术中的一种来确定任务何时完成(长轮询,Web套接字,服务器发送事件,每N秒一次AJAX请求,或者死亡最简单:重新加载页面)每5秒钟).

让您的Web请求"启动"单独的流程

无论如何,正如我所说,处理请求的视图不会执行长时间操作:它只是启动后台进程来执行任务.您可以自己创建此后台进程调度(查看此Flask片段以获取可能的想法),或使用像Celery或(RQ)这样的库.

任务完成后,您需要某种方式通知用户.这取决于您在上面选择的通知方法.对于一个简单的"每N秒ajax请求",您需要创建一个处理AJAX请求的视图,以检查任务是否完成.执行此操作的典型方法是让长时间运行的任务作为最后一步,对数据库进行一些更新.然后,检查状态的请求可以检查数据库的这一部分以获取更新.

的优点和缺点

使用此方法(而不是尝试将长时间运行的任务放入请求中)有一些好处:

1.)处理长时间运行的Web请求是一件棘手的事情,因为有多个点可能会超时(除了浏览器和服务器).使用此方法,您的所有Web请求都非常短,并且不太可能超时.

2.)Flask(以及类似的其他框架)旨在仅支持可响应Web查询的特定数量的线程.假设它有8个线程:如果其中四个处理长请求,那么只留下四个请求来实际处理更多典型请求(比如用户获取其配置文件页面).你的网络服务器的一半可能被捆绑做一些不提供网络内容的东西!更糟糕的是,您可以让所有八个线程运行一个很长的进程,这意味着您的站点完全无法响应Web请求,直到其中一个完成.

主要缺点:在启动和运行任务队列方面有一些更多的设置工作,它确实使整个系统稍微复杂一些.但是,我强烈建议将此策略用于在Web上运行的长时间运行的任务.