1

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

4

2 回答 2

0

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

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

<HEAD>
<META http-equiv="refresh" content="3">
</HEAD> 
于 2013-05-03T05:03:26.230 回答
0

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

建议的解决方案

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

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

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

替代解决方案

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

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

附加信息

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

于 2014-02-21T14:35:04.650 回答