Kaa*_*ral 5 google-app-engine app-engine-ndb
使用ndb,假设我put_async'd 40个元素,使用@ ndb.toplevel,向用户写了一个输出并结束了请求,但是其中一个put_async导致了争用异常,响应是500还是200?或者让我们说如果它是一个任务,那么任务会被重新执行吗?
一个解决方案是get_result()在请求结束之前查看所有这40个请求并捕获这些异常 - 如果它们发生 - 但我不确定它是否会影响性能.
这很奇怪,我使用 toplevel 并期望相反的行为。这就是我所观察到的。自从第一次回答这个问题以来,有什么变化吗?正如医生所说:
这反过来又可以让您发送请求而不必担心结果。
您可以尝试以下单元测试(使用测试床):
@ndb.tasklet
def raiseSomething():
yield ndb.Key('foo','bar').get_async()
raise Exception()
@ndb.toplevel
def callRaiseSomething():
future = raiseSomething()
return "hello"
response = callRaiseSomething()
self.assertEqual(response, "hello")
Run Code Online (Sandbox Code Playgroud)
这个测试通过了。NDB 记录警告:“挂起的生成器 raiseSomething(tests.py:90) 引发 Exception()”,但它不会重新引发异常。
ndb.toplevel 仅等待 RPC,但不执行实际结果。如果你的装饰函数本身就是一个tasklet,它会首先调用它的 get_result() 。此时将引发异常。然后它将等待剩余的“孤立”RPC,并且仅在引发异常时才会记录某些内容。
所以我的回复是:请求会成功(返回200)
| 归档时间: |
|
| 查看次数: |
1049 次 |
| 最近记录: |