gpt4 book ai didi

google-app-engine - 在请求结束后,在带有 NDB 的 Appengine 上,当异步放置导致争用异常时会发生什么?

转载 作者:太空宇宙 更新时间:2023-11-03 15:24:22 24 4
gpt4 key购买 nike

使用 ndb,假设我使用 @ndb.toplevel put_async'd 40 个元素,向用户写入输出并结束请求,但是其中一个 put_async 导致争用异常,响应是 500 还是 200?或者说如果它是一项任务,该任务会重新执行吗?

一个解决方案是在请求结束之前获取所有这 40 个请求并捕获这些异常 - 如果它们发生 - 但我不确定它是否会影响性能。

最佳答案

据我所知,使用@ndb.toplevel 会导致处理程序在退出之前等待所有异步操作完成。来自文档:

As a convenience, you can decorate the request handler with @ndb.toplevel. This tells the handler not to exit until its asynchronous requests have finished. This in turn lets you send off the request and not worry about the result. https://developers.google.com/appengine/docs/python/ndb/async#intro

因此,通过添加 @ndb.toplevel,在异步方法完成执行之前,实际上不会返回响应。使用 @ndb.toplevel 消除了对所有被触发的异步调用调用 get_result 的需要(为了方便)。 因此基于此,如果异步查询失败,请求仍将返回 500,因为所有异步查询都需要在返回之前完成。 更新:如下

如果使用任务(我假设您指的是任务队列),任务队列将在请求失败时重试请求。所以你的处理程序可能是这样的:

def get(self):
deferred.defer(execute_stuff_in_background, param,param1)
template.render(...)

一旦处理程序返回,execute_stuff_in_background 将执行所有昂贵的 put。如果任务中存在争用问题,您的原始处理程序仍会返回 200。

如果您怀疑会出现争用问题,可以考虑分片或使用 fork 连接队列实现来处理写入(参见此处的实现:http://www.youtube.com/watch?v=zSDC_TU7rtc#t=41m35)

编辑:简答如果异步请求失败,请求将失败(返回 500),因为 @ndb.toplevel 等待在退出之前完成所有结果。 更新:看了下面@alexis 的回答后,我重新运行了我的原始测试(我关闭了数据存储写入并在用@ndb.toplevel 修饰的处理程序中调用了 put_async),响应间歇性地提高了 500 (我假设这取决于执行时间)。基于这个和下面@alexis 的回答,如果异步任务抛出异常并且调用函数用@ndb.toplevel 装饰,不要期望结果是 500

关于google-app-engine - 在请求结束后,在带有 NDB 的 Appengine 上,当异步放置导致争用异常时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12224915/

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