我正在使用最初使用阻塞數據庫調用編寫的python扭曲應用程序。我正在改變它使用adbapi,所以數據庫調用變得非阻塞。我想我已經知道了,我只是想確保我不會錯過任何東西。從adbapi獲取結果而不會延遲
有部分代碼通過4或5函數調用鏈,數據庫結果在該鏈的最底層使用。鏈的每個函數都使用常規返回語句將結果返回到先前的級別。
我是否必須將每個級別更改爲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數據庫的結果,而不必把它們變成Deferreds?我認爲答案是否定的,但是在我真正開始爲此重構整個代碼庫之前,我想確定一下。