使用GAE 1.5.0的新版本,我们现在可以轻松地进行异步数据存储调用。我们是否需要在致电后致电get_result()
'put_async'?
例如,如果我有一个名为MyLogData
的模型,我可以调用:
put_async(MyLogData(text="My Text"))
在我的处理程序返回之前没有调用匹配的get_result()
?
在将结果发送给客户端之前,GAE是否会自动阻止任何待处理的呼叫?
请注意,我并不真正关心错误情况。也就是说,如果其中一些失败,我不介意。
答案 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=2
和ms=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员可以肯定地回答。