60年代的最后期限是如何应用于appengine .run和.fetch检索的?

时间:2014-12-23 12:26:59

标签: python google-app-engine bigtable

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有点缺乏截止日期的确切应用方式。

1 个答案:

答案 0 :(得分:1)

不,你误解了截止日期所指的内容。您链接到州的文档:

  

等待数据存储区在中止错误之前返回结果的最长时间(以秒为单位)

这里的截止日期是获取结果的远程过程调用。你花多长时间迭代它们是完全无关紧要的。当然,在获取第二组时您对失败的引用是错误的:这是两个单独的呼叫,处理第一个呼叫结果所花费的时间不会以任何方式影响第二个呼叫。

在正常情况下,RPC将在几微秒内完成,但有时可能需要等待更长时间;例如,如果记录被交易锁定。