gpt4 book ai didi

python - 如何处理来自 ndb.put_multi 的错误

转载 作者:行者123 更新时间:2023-11-28 16:34:49 26 4
gpt4 key购买 nike

严重缺乏 GAE ndp.put_multi 的文档。 NDB Entities and Keys - Python — Google Cloud Platform显示它返回一个键列表 (list_of_keys = ndb.put_multi(list_of_entities)),但它没有说明失败。 NDB Functions没有提供更多信息。

深入研究代码(如下),告诉我,至少现在,put_multi 只是聚合从异步方法返回的 Future.get_result(),它本身委托(delegate)给实体的 put 代码。现在,docs for the NDB Future Class指示将返回结果,否则将引发异常。然而,有人告诉我,如果特定的 put 失败,结果将是 None(我找不到任何权威文档,但如果它是什么像 db.get 这样才有意义)。

the code

所以所有这些都归结为一些我找不到答案的问题:

  1. 显然,返回值是一个列表——它是否包含一些可能没有元素的列表?还是使用异常(exception)代替?
  2. 当出现错误时,应该重新输入什么?是否可以重新放置所有实体(幂等),或者仅重新放置那些返回值为 None 的实体(如果这甚至是传达错误的方式)?
  3. 错误有多常见(一个答案:1/3000)?它们是否出现在日志中(因为我没有看到)?有没有办法可靠地模拟测试错误?

Usage of the function in an open source library暗示该操作是幂等的,仅此而已。 ( Other usages don't even bother checking the return value or catching exceptions .)

Handling Datastore Errors除了异常(exception),什么也没提到。

最佳答案

我同意您对代码的阅读:put_multi() 以与 put_async().get_result() 相同的方式对错误作出 react 。如果 put() 会引发异常,put_multi() 也会引发异常,并且对于确定多次调用中的哪一次失败没有帮助。我不知道 put_multi() 会为 key 列表中的某些条目返回 None 的情况。

您可以重新放置已放置的实体,假设自上次放置尝试后没有其他用户更新过这些实体。使用系统生成的 ID 创建的实体会更新其内存中的键,因此重新放置这些键会覆盖现有实体,而不会创建新实体。我不会称它为幂等,因为重试会覆盖其他进程对这些实体所做的任何更新。

当然,如果您需要对结果进行更多控制,您可以在事务中执行此更新,尽管所有实体都需要位于同一实体组中才能使用原始事务。 (跨组事务最多支持五个不同的实体组。)如果任何尝试失败,事务期间的失败将确保不会创建或更新任何实体。

我不知道更新失败的一般错误率。此类故障最有可能包括争用错误或“热片”(在太短的时间内对附近记录的更新过多,导致超时),这取决于应用程序行为。 API 将所有此类错误报告为异常。

测试错误处理调用路径的最简单方法是包装 Model 类并使用测试模式行为覆盖方法。您可以更深入地研究 testbed 使用的 stub API,它可能有一种 Hook 低级调用和模拟错误的方法。 (我认为这不是 testbed 的直接功能,但您可以使用类似的技术。)

关于python - 如何处理来自 ndb.put_multi 的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27709192/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com