我正在实现一个以 Google Appengine 作为后端的 Web 应用程序,其预期行为如下:
- 用户选择几个参数进行复杂分析
- 用户按下“开始”
- 最初为空的“响应”页面返回给用户,但处理继续
- 分析以某种方式在服务器上继续进行,并且在计算部分结果时,它们会显示/添加到响应页面中。
我预计总计算时间约为 30-40 秒(远低于 Appengine 所需的 60 秒)。
步骤 1 和 2 很简单。我知道可以使用步骤 AJAX 以某种方式完成第 4 步,但我不确定如何准确地实现第 3 步。
谢谢!
我正在实现一个以 Google Appengine 作为后端的 Web 应用程序,其预期行为如下:
我预计总计算时间约为 30-40 秒(远低于 Appengine 所需的 60 秒)。
步骤 1 和 2 很简单。我知道可以使用步骤 AJAX 以某种方式完成第 4 步,但我不确定如何准确地实现第 3 步。
谢谢!
您可以使用任务队列和数据存储。您需要 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 来加速此方法。
就是这样:
这应该比使用任务队列更快,但不幸的是,您需要一种在任务启动之前识别任务的方法。例如用户ID、会话等
查看频道 API。它允许您将消息从服务器推送到客户端。