从服务器端完成计算后重新加载图像/页面

时间:2013-05-03 04:36:48

标签: python apache http flask

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

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

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

建议的解决方案

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

  

订阅者将连接并阻塞很长一段时间,因此您应该认真考虑在异步WSGI服务器下运行,例如gunicorn + gevent

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

替代解决方案

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

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

其他信息

如果您需要同时更新多个位置(不仅是浏览器),您可以使用队列服务,例如ironMQ,它允许您将消息传播到特殊队列,然后使用队列服务订阅客户端并从中接收消息。这就是我发现之前我发现可以直接查询工作人员的状态。