gpt4 book ai didi

google-app-engine - ndb.transaction_async() 与事务内的异步调用

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

我正在将我的 ndb 代码库尽可能多地移动到有意义的地方。有一种情况我不太确定如何进行:事务。

在我看来,我有 3 个可用选项:

选项 1:同步调用 ndb.transaction(),并让事务的函数调用异步方法。

def option_1():
@ndb.tasklet
def txn():
e = yield Foo.get_by_id_async(some_id)
if e is None:
e = yield Foo().put_async()
raise ndb.Return(e)

# The doc for ndb.transaction() says that it takes a function or tasklet.
# If it's a tasklet, does it wait on the Future that is returned?
# If it doesn't wait, what is the proper way to call a tasklet in a transaction
# and get access to its return value?
return ndb.transaction(txn)

选项 2:异步调用 ndb.transaction(),并让事务的函数调用同步方法。

@ndb.toplevel
def option_2():
def txn():
e = Foo.get_by_id(some_id)
if e is None:
e = Foo().put()
return e

result = yield ndb.transaction_async(txn)
return result

选项 3:异步调用 ndb.transaction(),并让事务的函数调用异步方法。

@ndb.toplevel
def option_3():
@ndb.tasklet
def txn():
e = yield Foo.get_by_id_async(some_id)
if e is None:
e = yield Foo().put_async()
raise ndb.Return(e)

result = yield ndb.transaction_async(txn)
return result

我觉得选项 3 是可行的,但我宁愿依赖专家的意见/建议...

最佳答案

是的,#3 绝对是正确的选择。其他两个存在混合异步和同步代码的问题,这通常不是一件好事,除非是在您的应用程序的最顶层。

附言。事实上,如果它是一个 tasklet,事务会等待回调。

关于google-app-engine - ndb.transaction_async() 与事务内的异步调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14824763/

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