我正在使用python twisted应用程序,它最初是使用阻塞数据库调用编写的。我正在将其更改为使用adbapi,以便数据库调用成为非阻塞的。我想我已经很清楚了,我只是想确定我没有遗漏什么。
代码的某些部分会经过4或5个函数的调用链,而数据库结果将在该链的最低级别使用。链的每个函数都使用一个常规的返回语句将结果返回到上一级。
为了正确地执行此操作,我是否必须将每个级别更改为延迟级别,或者在使用常规return语句时是否有某种方法来获取和使用数据库结果?简化示例:
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_查询更改为非阻塞调用,它必须变为(或返回)延迟调用。所以为了在其他函数中使用结果,我也需要将它们更改为这个值,因为它们需要产生值才能使用它,对吧?
@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中的数据库结果,而不必将它们转换为延迟?我认为答案是否定的,但是我想在我真正开始重构整个代码库之前确定一下。
最佳答案
是的,我明白了。任何需要使用并返回调用链中数据的函数都必须是或返回延迟的。如果链中有一个函数不使用数据,而只是传递数据,那么它可以使用常规的return语句来实现这一点。
关于python - 从adbapi获得结果而不是延期,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22206669/