gpt4 book ai didi

python - 从 adbapi 获取结果而不成为 Deferred

转载 作者:可可西里 更新时间:2023-11-01 08:48:05 24 4
gpt4 key购买 nike

我正在使用一个 python 扭曲的应用程序,该应用程序最初是使用阻塞数据库调用编写的。我正在将其更改为使用 adbapi,以便数据库调用变得非阻塞。我想我已经弄明白了,我只是想确保我没有遗漏任何东西。

部分代码通过 4 或 5 个函数调用链,数据库结果在该链的最低级别使用。链的每个函数都使用常规的 return 语句将结果返回到上一级。

我是否必须将每个级别更改为 Deferred 才能正确执行此操作,或者是否有某种方法可以在仍然使用常规返回语句的同时获取和使用数据库结果?简化示例:

def db_query():
cur.execute("SELECT * FROM table")
return cur.fetchone()

def f2():
result = db_query()
print result
return result

def f1():
result = f2()
result.reverse()
print result

为了将 db_query 更改为非阻塞调用,它必须成为(或返回)一个 Deferred。因此,为了在其他函数中使用结果,我也需要将它们更改为那个,因为它们需要产生值才能使用它,对吗?

@defer.inlineCallbacks
def db_query():
result = yield dbpool.runQuery("SELECT * FROM table")
defer.returnValue(result[0])

@defer.inlineCallbacks
def f2():
result = yield db_query()
print result
defer.returnValue(result)

@defer.inlineCallbacks
def f1():
result = yield f2()
result.reverse()
print result

所以我的问题是:有没有一种方法可以在函数 f2 和 f1 中访问、使用和返回数据库结果,而不必将它们转换为 Deferred?我认为答案是否定的,但在我真正开始为此重构整个代码库之前,我想确定一下。

最佳答案

是的,我没看错。任何需要在调用链中使用和返回数据的函数都必须是或返回一个延迟的。如果链中有一个函数不使用数据而只是传递它,它可以使用常规返回语句来完成。

关于python - 从 adbapi 获取结果而不成为 Deferred,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22206669/

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