2012-02-11 102 views
4

我有一个Google App Engine应用程序,可以执行30-50次到远程API的调用。每个电话都需要一秒钟左右的时间,因此整个操作可能需要一分钟。目前,我在我的站点的post()函数内的一个循环中执行此操作,因此在整个操作完成之前不会打印响应。不用说,目前该应用程序并不是非常有用。Google App Engine中的进度条

我想要做的是在操作开始后立即打印响应,然后在每个单独的API调用完成时更新它。我将如何实现这一目标?在桌面应用程序中,我只需启动一个定期更新前端的工作线程。 Google App Engine中是否有类似的机制?

我搜索了“进度条”和“谷歌应用程序引擎”,但大多数结果来自想要监视上传文件进度的人。我的情况不同:服务器上正在执行耗时的任务,所以客户端无法监控其进度。 This guy是我能找到的最接近的东西,但他在Java中工作。

回答

3
  1. 发送POST逻辑使用http://code.google.com/appengine/docs/python/taskqueue
  2. 更改日志中的任务过程中设置状态(可以使用内存缓存)
  3. 使用AJAX查询内存缓存状态的IC每10秒,或多或少,这取决于你
+0

谢谢你的帮助。我使用了任务队列,并使用Channel API推送更新(就像@Moishe也提到的那样)。在客户端,我编写JavaScript来使用消息并更新前端。 – misha 2012-02-11 18:17:56

+0

一些伪代码示例对其他人非常有用。我现在有同样的问题。 – user1911091 2014-10-02 23:36:36

3

你可以从你的帖子立即返回,并做两件事情之一:从客户端

  • 投票每秒左右,让您的服务供其状态
  • 使用通道API推状态更新到你的客户
+0

很高兴听到推拉更新仍然适用于谷歌应用程序商店的土地,但你能更具体一点吗?例子会非常棒。谢谢。第一个选项对我来说听起来特别好。 – misha 2012-02-11 13:51:45

0

短版:使用任务队列写入随着操作的进行而转移到memcache密钥。然后您的页面可以使用通道API或重复轮询服务器以获取进度报告。

长版本:在您的文章中,您将大任务委派给任务。该任务将定期更新驻留在内存缓存中的密钥。如果您没有时间学习频道API,则可以让帖子返回的页面定期在应用中获取一些URL,以便根据memcache数据返回进度报告,然后可以更新进度栏。作业完成后,脚本可以转到结果页面。

如果你有时间,学习Channel API是值得的。在这种情况下,该任务将接收通道令牌,以便它可以与页面中的JavaScript通道客户端进行通信,而无需进行轮询。