Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从adbapi获取结果而不成为延迟_Python_Mysql_Twisted - Fatal编程技术网

Python 从adbapi获取结果而不成为延迟

Python 从adbapi获取结果而不成为延迟,python,mysql,twisted,Python,Mysql,Twisted,我正在使用python twisted应用程序,该应用程序最初是使用阻塞数据库调用编写的。我将其更改为使用adbapi,以便数据库调用成为非阻塞的。我想我已经基本明白了,我只是想确保我没有遗漏什么 代码的某些部分经过4或5函数调用链,数据库结果在该链的最低级别使用。链中的每个函数都使用一个常规return语句将结果返回到上一级 为了正确地执行此操作,我是否必须将每个级别更改为Deferred,或者是否有某种方法可以在仍然使用常规return语句的情况下获取和使用数据库结果?简化示例: def d

我正在使用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_查询更改为非阻塞调用,它必须成为(或返回)延迟调用。所以为了在其他函数中使用结果,我也需要将它们更改为那样,因为它们需要产生值才能使用它,对吗

@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语句来实现