appengine文档声明.run()和.fetch()的默认截止时间是60秒。我想确切地了解截止日期是如何应用的,特别是在任务或cron作业的上下文中,整个过程可以运行10分钟。想象一下,我们有1000只鹅:
geese = Goose.all().run(batch_size=100)
for goose in geese:
goose.cook()
# for sake of example, cooking a goose takes 1 second
如果我理解正确,这将从数据存储中检索100只鹅,并依次烹饪每只鹅。当它到达第61只鹅时,超过60秒将会过去,但这并不重要,因为在调用.run时检索到所有100个结果。在第100只鹅之后,它将尝试检索下一批100只鹅,这将导致截止日期超出错误。是吗?
假设这是对的,那么如果我们这样做:
geese = Goose.all().run(batch_size=100, limit=100)
for goose in geese:
goose.cook()
# for sake of example, cooking a goose takes 1 second
我认为这将在没有截止日期超出错误的情况下执行。是对的吗?当然,它只会检索前100只鹅。如果我们想要101-200,那么我们需要再次查询,可能是使用游标。
假设这是正确的,
之间的这种情况有什么不同geese = Goose.all().run(batch_size=100, limit=100)
--- and ---
geese = Goose.all().fetch(batch_size=100, limit=100)
对于上下文:我们在生产应用程序中有很多或run()s和一些fetch(),并且偶尔会看到截止日期异常。我们想要证明他们是正确的,但是发现the docs有点缺乏截止日期的确切应用方式。
答案 0 :(得分:1)
不,你误解了截止日期所指的内容。您链接到州的文档:
等待数据存储区在中止错误之前返回结果的最长时间(以秒为单位)
这里的截止日期是获取结果的远程过程调用。你花多长时间迭代它们是完全无关紧要的。当然,在获取第二组时您对失败的引用是错误的:这是两个单独的呼叫,处理第一个呼叫结果所花费的时间不会以任何方式影响第二个呼叫。
在正常情况下,RPC将在几微秒内完成,但有时可能需要等待更长时间;例如,如果记录被交易锁定。