Python 避免或处理;BadRequestError:请求的查询已过期;?

Python 避免或处理;BadRequestError:请求的查询已过期;?,python,google-app-engine,google-cloud-datastore,Python,Google App Engine,Google Cloud Datastore,我使用链接的延迟任务和查询游标在AppEngine中循环数据。Python2.7,使用db(而不是ndb)。例如 此操作总共运行约75分钟(每个任务运行约1分钟),然后引发此异常: BadRequestError:请求的查询已过期。请使用最后一个光标重新启动,以读取更多结果。 阅读,唯一说明的原因是: 新的应用程序引擎版本可能会更改内部实现细节,使依赖它们的游标无效。如果应用程序试图使用不再有效的游标,数据存储将引发BadRequestError异常 所以,也许这就是发生的事情,但我第一次尝试这

我使用链接的延迟任务和查询游标在AppEngine中循环数据。Python2.7,使用db(而不是ndb)。例如

此操作总共运行约75分钟(每个任务运行约1分钟),然后引发此异常:

BadRequestError:请求的查询已过期。请使用最后一个光标重新启动,以读取更多结果。

阅读,唯一说明的原因是:

新的应用程序引擎版本可能会更改内部实现细节,使依赖它们的游标无效。如果应用程序试图使用不再有效的游标,数据存储将引发BadRequestError异常

所以,也许这就是发生的事情,但我第一次尝试这种技术时,我遇到了“内部实现的变化”(除非这种情况经常发生),这似乎是巧合

这还有别的解释吗? 有没有办法重新设计代码以避免这种情况

如果没有,我认为唯一的解决方案是标记哪些资产已被处理,然后在查询中添加一个额外的过滤器以排除这些资产,然后在每次流程死亡时手动重新启动流程

作为参考,我问了一些类似的问题,但公认的答案是“使用光标”,我已经在这么做了,所以这不可能是同一个问题

您可能想看看

MapReduce是一种用于处理大量数据的编程模型 以并行和分布式的方式。对于大型, 无法在单个任务范围内处理的长时间运行的作业 请求,任务如下:

  • 分析应用程序日志
  • 从外部来源聚合相关数据
  • 将数据从一种格式转换为另一种格式
  • 导出用于外部分析的数据

当我问这个问题时,我已经运行了一次代码,并经历了一次BadRequestError。然后我再次运行它,它完成了,没有出现错误,总共运行了6个小时。所以在这一点上,我想说这个问题的最佳“解决方案”是使代码幂等(以便可以重试),然后添加一些代码以自动重试

在我的具体案例中,还可以调整查询,以便在光标“过期”的情况下,查询可以在没有光标的情况下重新启动。有效地将查询更改为:

assets = models.Asset.all().order('-size').filter('size <', last_seen_size)

assets=models.Asset.all().order('-size').filter('size谢谢。在我的is_special()块中,我实际上正在调用AWS S3(通过boto sdk)哪个是urlfetch。这可以在MapReduce中完成,还是仅限于数据操作?我认为您可以在处理数据的另一个阶段之前添加一个阶段来执行urlfetch:是的,您可以按照使用自定义输入读取器来执行urlfetch。值得注意的是,BadRequestError并不总是导致实现更改的原因e-这可能是由于单个子查询超时造成的。实现重试可能是一个解决方案。@Adam谢谢。您有关于BadRequestError的其他原因的文档链接吗?-我很乐意阅读。
assets = models.Asset.all().order('-size').filter('size <', last_seen_size)