【问题标题】:reload image/page after computation is complete from the server side从服务器端计算完成后重新加载图像/页面
【发布时间】:2013-04-27 10:17:23
【问题描述】:

我有一个 python 代码,它执行一些相当密集的计算,然后生成一个图(png 文件)以在网络上显示。我正在使用 python、flask、mod_wsgi 和 apache。由于计算需要几秒钟(大约 10 秒),我想在计算发生时显示“加载”类型的图像,这样查看者就不会认为服务器搞砸了,然后是计算时的实际图像是完整的。如何从服务器端执行此操作(不在 Web 浏览器中使用 javascript)?在过去,我记得看到很多网页,似乎服务器正在向浏览器推送一个新页面(回忆起来最多的是消息论坛上的搜索引擎)。我相信这个问题的答案确实是一个与 http 相关的问题,因此它不一定必须特定于提供图像(可能是 html 页面),或者使用 python、flask、mod_wsgi 或 apache,但它如果可以仅针对该配置提供示例,那就太好了。

【问题讨论】:

  • 为什么不想使用 JavaScript?我会在一个单独的线程中运行绘图,然后用 JavaScript 轮询它以查看它何时完成。
  • 我想部分原因是我不知道该怎么做。这是否意味着单独的线程必须以某种方式将计算数据保存到磁盘?有关执行单独线程和轮询线程完成的任何链接?
  • 这里是一个做我所说的网站的例子。首先出现一个显示正在加载的页面,然后在几秒钟内出现真正的页面。 bugzilla.mozilla.org/buglist.cgi?quicksearch=anything 如果查看页面源代码,看起来几乎就像发送了两个 HTML 页面,但由于某种原因,浏览器在发送第二个页面后忽略了第一个页面。他们在这里所做的事情是否有一个名称,它是否适用于每个浏览器?它是否适用于 text/html 以外的其他内容类型?
  • Bugzilla 使用HTTP server push(特别是第三段中的方法)。它在 Chrome 中似乎不起作用,在 IE 中肯定不起作用。
  • 好的。 IE 是否再次不支持标准,或者如果 Bugzilla 碰巧不符合标准,这有点误导?过去我见过许多具有类似功能的网页,如果它们都在做非标准的事情,我会感到惊讶。那么没有提供自动刷新的jpeg图像的网络摄像头可以与IE一起使用吗?我过去见过很多这样的东西,但从未注意到有人说他们不使用 IE。

标签: python apache http flask


【解决方案1】:

在使用 Javascript 之前,我确实通过生成一个在 HTML 标题中刷新的页面来实现这一点,延迟 2-3 秒。

此页面会重新显示,直到生成该页面的代码注意到“结果”已完成,然后生成不同的 HTML 代码(无需刷新)。

<HEAD>
<META http-equiv="refresh" content="3">
</HEAD> 

【讨论】:

    【解决方案2】:

    我知道这个问题现在有点老了,但我觉得关于这个主题的信息不足。我自己也在努力寻找相关信息,所以我希望这会有所帮助:

    建议的解决方案

    这里可以使用不同的技术,但我相信最简单的技术是Server Sent Events。 Flask can be found here 的实现。文档的最后一部分非常重要:

    订阅者会长时间连接和阻塞,所以你应该认真考虑在异步WSGI服务器下运行,例如gunicorn+gevent

    所以一定要满足要求。此外,如果您想将消息从 您的 服务器发送到客户端,了解这种方法非常重要,这一点非常重要。如果您有一个外部工作人员为您进行计算,这种方法只会使您的计算更加复杂,因为您的服务器必须在浏览器和工作机器之间扮演中间人的角色。在某些主机上,它甚至可能无法按预期工作(例如 Heroku - 仍然不确定为什么它行为不端,看起来来自工作人员的更新太多并且没有正确传播到客户端)。如果您为您的应用程序和工作人员使用相同的主机,那么您应该没有问题。

    替代解决方案

    在我看来,这种类型的计算属于背景,所以这个解决方案假设我们有某种工人为你做这项工作(就像我第一次遇到问题时所做的那样)。请注意,此解决方案不是服务器->客户端通信,而是基于轮询。如果您不在生产中的异步服务器上运行,我认为这可能是唯一的选择。

    因此,假设您有一个可以检查其状态的工人,例如 Iron Worker。用户访问您的页面,这会调用工作人员的计算。从此时起,您应该使用 AJAX 调用直接从您的工作人员那里获取状态更新。我在我的应用程序中做了什么,我使用 jQuery 来轮询 worker web api 并了解它的状态。在您发现您的工作人员完成后,您可以重新加载页面或仅重新加载图像或您需要的任何其他内容。

    其他信息

    如果你需要同时更新很多地方(不仅仅是浏览器),你可以使用队列服务,例如 IronMQ,它允许你将你的消息传播到一个特殊的队列,然后订阅这个队列客户端并从它接收消息。这是我在发现我可以直接查询工人的状态之前所做的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-19
      • 2019-03-29
      • 2016-09-05
      相关资源
      最近更新 更多