get_result()是Google App Engine中put_async()的必需调用

时间:2011-05-19 16:19:10

标签: python google-app-engine asynchronous google-cloud-datastore

使用GAE 1.5.0的新版本,我们现在可以轻松地进行异步数据存储调用。我们是否需要在致电后致电get_result() 'put_async'?

例如,如果我有一个名为MyLogData的模型,我可以调用:

put_async(MyLogData(text="My Text"))

在我的处理程序返回之前没有调用匹配的get_result()? 在将结果发送给客户端之前,GAE是否会自动阻止任何待处理的呼叫?

请注意,我并不真正关心错误情况。也就是说,如果其中一些失败,我不介意。

3 个答案:

答案 0 :(得分:7)

我认为没有任何确定的方法可以知道是否需要get_result(),除非GAE团队中有人验证了这一点,但我认为不需要。{}这是我测试它的方式。

我写了一个简单的处理程序:

class DB_TempTestModel(db.Model):
    data = db.BlobProperty()

class MyHandler(webapp.RequestHandler):
    def get(self):
        starttime = datetime.datetime.now()
        lots_of_data = ' '*500000
        if self.request.get('a') == '1':
            db.put(DB_TempTestModel(data=lots_of_data))
            db.put(DB_TempTestModel(data=lots_of_data))
            db.put(DB_TempTestModel(data=lots_of_data))
            db.put(DB_TempTestModel(data=lots_of_data))
        if self.request.get('a') == '2':
            db.put_async(DB_TempTestModel(data=lots_of_data))
            db.put_async(DB_TempTestModel(data=lots_of_data))
            db.put_async(DB_TempTestModel(data=lots_of_data))
            db.put_async(DB_TempTestModel(data=lots_of_data))
        self.response.out.write(str(datetime.datetime.now()-starttime))

我在高复制应用程序上运行了很多次。

数据总是存在,让我相信除非数据存储方面出现故障(不太可能),否则它将被写入。

这是有趣的部分。使用put_async()?a=2)写入数据时,处理请求的时间平均为put()的{​​2}的{2} ?a=1 cpu_ms }(不是一个非常科学的测试 - 只是眼睛看它)。

api_cpu_ms?a=1 ?a=2ms=440 cpu_ms=627 api_cpu_ms=580 cpm_usd=0.036244的{​​{1}}和ms=149 cpu_ms=627 api_cpu_ms=580 cpm_usd=0.036244相同。

来自日志:

{{1}}

VS

{{1}}

在客户端,查看请求的网络延迟,它显示相同的结果,即“?a = 2”请求至少快2倍。绝对是客户端的胜利......但似乎在服务器端没有任何收获。

GAE团队的任何人都在关注评论?

答案 1 :(得分:3)

db.put_async在部署时没有get_result (处于“即发即弃”样式)时工作正常,但在locally it won't take action until get_result中调用more context

答案 2 :(得分:2)

我不知道,但这有效:

import datetime
from google.appengine.api import urlfetch

def main():
  rpc = urlfetch.create_rpc()
  urlfetch.make_fetch_call(rpc, "some://artificially/slow.url")
  print "Content-type: text/plain"
  print
  print str(datetime.datetime.now())

if __name__ == '__main__':
  main()

远程URL会休眠3秒钟,然后向我发送一封电子邮件。 App Engine处理程序立即返回,远程URL按预期完成。由于两个服务都抽象相同的底层RPC框架,我猜数据存储区的行为类似。

但问题很好。也许尼克或其他Google员可以肯定地回答。