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

Posted

技术标签:

【中文标题】60 年代的最后期限如何应用于 appengine .run 和 .fetch 检索?【英文标题】:How is the 60s deadline applied to appengine .run and .fetch retrieval? 【发布时间】:2014-12-23 12:26:59 【问题描述】:

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() 和一些 fetch(),并且偶尔会看到截止日期异常。我们想加强它们,但发现the docs 有点缺乏确切的截止日期是如何应用的。

【问题讨论】:

【参考方案1】:

不,您误解了截止日期的含义。您链接到的文档说明:

等待 Datastore 返回结果的最长时间(以秒为单位),然后因错误而中止

这里的最后期限是获取结果的远程过程调用。你需要多长时间来迭代它们是完全无关的。当然,您在获取第二组时提到的失败是不正确的:这是两个单独的调用,处理第一个调用的结果所花费的时间不会以任何方式影响第二个调用。

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

【讨论】:

啊!所以你是说我们可以在鹅身上迭代整整 10 分钟,偶尔会发生批量数据检索(由 appengine 协调),只要这些检索没有一个单独超过 60 秒,就不会有错误.对吗? 除了默认的 60 秒截止日期外,查询数据库是否还有其他时间限制? 正确。我不知道查询的任何其他实际限制(与实体组的写入限制相反);但是对于查询当然你总是需要知道eventual consistency的含义。

以上是关于60 年代的最后期限如何应用于 appengine .run 和 .fetch 检索?的主要内容,如果未能解决你的问题,请参考以下文章

如何增加 Cloud Scheduler 请求超时期限?

函数式编程是如何提升代码的扩展性

PCM是啥?

在物联网时代,啥是语音识别技术呢?

Python 缩进语法的起源:上世纪 60-70 年代的大胆创意!

Python 缩进语法的起源:上世纪 60-70 年代的大胆创意!