2014-03-05 12 views
3

我正在使用最初使用阻塞數據庫調用編寫的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?我認爲答案是否定的,但是在我真正開始爲此重構整個代碼庫之前,我想確定一下。

回答

1

是的,我理解正確。任何需要使用和返回調用鏈中的數據的函數都必須或返回一個延遲。如果鏈中有一個函數不使用數據,只是傳遞數據,它可以通過常規的return語句來完成。