【问题标题】:Time out issues with chrome and flaskchrome和flask的超时问题
【发布时间】:2013-08-10 05:32:41
【问题描述】:

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

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

【问题讨论】:

    标签: python google-chrome web-applications flask


    【解决方案1】:

    假设:

    1. 这不是服务器问题,所以我们不必摆弄 Apache、nginx 等超时设置。

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

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

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

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

    【讨论】:

      【解决方案2】:

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

      最后,这类问题通常通过改变架构来解决。

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

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

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

      无论如何,正如我所说,处理请求的视图不会执行长时间的操作:它只是启动一个后台进程来为其执行任务。您可以自己创建这个后台进程调度(查看this Flask snippet 了解可能的想法),或使用类似Celery 或(RQ)的库。

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

      优点和缺点

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

      1.) 处理长时间运行的 Web 请求是一项棘手的工作,因为存在多个可能超时的点(除了浏览器和服务器)。使用这种方法,您的所有 Web 请求都非常短,并且超时的可能性大大降低。

      2.) Flask(和其他类似的框架)被设计为只支持一定数量的可以响应 Web 查询的线程。假设它有 8 个线程:如果其中四个正在处理长请求,那么只剩下四个请求来实际处理更典型的请求(比如用户获取他们的个人资料页面)。您的一半 Web 服务器可能会忙于执行不提供 Web 内容的操作!更糟糕的是,您可能让所有八个线程都运行一个长进程,这意味着您的网站在其中一个完成之前完全无法响应 Web 请求。

      主要缺点:在启动和运行任务队列时需要做更多的设置工作,而且确实会使您的整个系统稍微复杂一些。但是,我强烈建议将这种策略用于在 Web 上运行的长时间运行的任务。

      【讨论】:

        【解决方案3】:

        我相信这是由于您的网络服务器(大多数情况下是 apache)的超时时间太小。尝试增加这个数字

        对于 apache,请查看 timeout option

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

        【讨论】:

        • 也许我的问题不是很清楚,我认为服务器没有超时(尽管为了完整起见,我正在使用 werkzeug ......烧瓶中的默认值)。服务器仍在处理中,最终将使用 POST,但 chrome 已经默认为“无数据返回”页面。我已更新问题以解决此问题
        • @sedavidw 你能找到解决这个问题的方法吗?我一直面临同样的问题并尝试了多种方法。没有工作。
        • @nEO 标记为解决方案的答案对我有用。在我的例子中,我启动了一个 celery 任务,加载了一个“间歇性网页”,它使用 jQuery 检查任务的状态,完成后会加载结果
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-04-24
        • 1970-01-01
        • 2019-08-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-11
        相关资源
        最近更新 更多