超时铬和烧瓶的问题

时间:2013-08-08 13:20:24

标签: python google-chrome web-applications flask

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

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

3 个答案:

答案 0 :(得分:13)

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

最后,这种问题通常会通过改变您的架构来解决。

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

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

让您的Web请求“启动”单独进程

无论如何,正如我所说,处理请求的视图不执行长动作:它只是启动后台进程来执行任务。您可以自行创建此后台流程调度(请查看this Flask snippet以获取可能的提示),或使用Celery或(RQ)等库。

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

优点和缺点

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

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

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

主要缺点:在启动和运行任务队列方面还有一些设置工作,它确实使整个系统稍微复杂一些。但是,我强烈推荐这种策略用于在网络上运行的长期运行任务。

答案 1 :(得分:0)

我认为这是由于您的Web服务器(在大多数情况下为apache),其超时时间很短。尝试增加这个数字

对于apache,请查看timeout option

编辑:我认为您无法在Chrome中设置此时间(see this topic on google forums even though it's really old) 在firefox中,在about:config页面上,键入timeout,您可以设置一些选项。我不知道Internet Explorer。

答案 2 :(得分:0)

我们假设:

  1. 这不是服务器问题,因此我们不必使用Apache,nginx等超时设置。

  2. 延迟是分钟,而不是几小时或几天,只是为了使场景易于管理。

  3. 您可以控制用户点击提交的网页,以及管理用户互动的网页。

  4. 如果获得了这些,我建议不要使用标准的HTML表单提交,而是让提交按钮启动JavaScript函数来监督处理。它会提出一个“请耐心等待......这可能需要一段时间”的样式消息,然后使用jQuery.ajax来调用具有长超时值的长时间服务器。 jQuery超时以毫秒为单位,因此60000 = 60秒。如果长于此值,请相应地增加指定的超时。我已经看到有报道称并非所有客户都允许超长时间超时(例如iOS上的Safari显然有60秒的限制)。但总的来说,这将为您提供一个平台来管理交互(与您的用户,与慢速服务器),而不是由简单的Web表单提交。

    这里有一些边缘案例需要考虑。 Web服务器超时可能确实需要向上调整(Apache默认为300秒,即5分钟,nginx更少,IIRC)。您的客户端超时(比如iOS)可能会有超出您所看到的延迟的最大值。等等。这些情况需要在服务器上进行调整,或采用不同的交互策略。但是我将开始一个AJAX管理的交互。