从adbapi获得结果而不是延期

时间:2014-03-05 18:53:31

标签: python mysql twisted

我正在使用最初使用阻塞数据库调用编写的python twisted应用程序。我正在更改它以使用adbapi,因此数据库调用变为非阻塞。我想我已经弄明白了,我只是想确保我没有错过任何东西。

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

我是否必须将每个级别更改为Deferred才能正确执行此操作,或者是否有某种方法可以在使用常规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_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中访问,使用和返回数据库结果而不必将它们变成Deferreds?我认为答案是否定的,但我想确保在我真正开始重构整个代码库之前。

1 个答案:

答案 0 :(得分:1)

是的,我理解正确。任何需要使用和返回调用链中的数据的函数都必须是或者返回延迟的函数。如果链中的某个函数不使用数据但只传递它,那么它可以通过常规的return语句来实现。