2

我正在实现一个以 Google Appengine 作为后端的 Web 应用程序,其预期行为如下:

  1. 用户选择几个参数进行复杂分析
  2. 用户按下“开始”
  3. 最初为空的“响应”页面返回给用户,但处理继续
  4. 分析以某种方式在服务器上继续进行,并且在计算部分结果时,它们会显示/添加到响应页面中。

我预计总计算时间约为 30-40 秒(远低于 Appengine 所需的 60 秒)。

步骤 1 和 2 很简单。我知道可以使用步骤 AJAX 以某种方式完成第 4 步,但我不确定如何准确地实现第 3 步。

谢谢!

4

2 回答 2

3

您可以使用任务队列和数据存储。您需要 3 个处理程序:

  1. 任务处理者,做艰苦的工作。它将其进度存储在数据存储中。
  2. 在后台启动任务并返回“空白”页面的处理程序
  3. 获取状态的处理程序

注意:页面不能真的是空白的。它必须有用于检查状态的javascript。我认为这也是正确的Channel API

无论如何继承Python中的代码:

class LongTaskStatus(ndb.Model):
  is_complete = ndb.BooleanProperty()
  percentage = ndb.FloatProperty()
  messages = ndb.StringProperty(repeated=True)

class LongTaskHandler(webapp2.RequestHandler):
  def get(self):

    # Query for existing status model or create a new one

    # Does work ...

    # Update progress
    status = LongTaskStatus()
    status.messages.appen('Still busy...')
    status.put()

    # Does work ...

class StartHandler(webapp2.RequestHandler):
  def get(self):

    # start the task
    taskqueue.add(url='/longtask')

    # Return a page which uses javascript to check the progress every few seconds
    template = JINJA_ENVIRONMENT.get_template('taskprogress.html')
    self.response.write(template.render(template_values))

class CheckTaskStatus(wenapp2.RequestHandler):
  def get(self):
    query = LongTaskStatus.query().fetch(1)
    result = {}
    if query:
      status = query[0]
      result = {
        'is_complete': status.is_complete,
        'percentage': status.percentage,
        'messages': status.messages
      }
    self.response.write(json.dumps(result))

这是“空白”页面:

<!DOCTYPE html>
<html lang="en">
  <body>
    <div id="status"></div>
    <script>
      window.setInterval(function(){
        $.get( "ajax/test.html", function( data ) {
          $( ".status" ).html( data );
        });
      }, 5000);
    </script>
  </body>
</html>

编辑:没有任务队列的其他选项

如果您有一种在任务启动之前识别任务的独特方法,则可以通过不使用任务队列 API 来加速此方法。

就是这样:

  1. 通过 javascript 调用 LongTaskHandler
  2. 重定向到调用 CheckTaskStatus 的加载页面。

这应该比使用任务队列更快,但不幸的是,您需要一种在任务启动之前识别任务的方法。例如用户ID、会话等

于 2013-10-07T00:53:37.783 回答
1

查看频道 API。它允许您将消息从服​​务器推送到客户端。

于 2013-10-06T20:14:23.187 回答