[教學] Twsited的骨幹 : Deferred

看板Python作者 (Victor)時間17年前 (2008/07/18 15:55), 編輯推噓1(100)
留言1則, 1人參與, 最新討論串1/1
接著來介紹Twsited的骨幹 : Deferred 這個東西在不了解它時也是一樣令人覺得有點混亂 但是了解它之後其實也是很簡單的一樣東西 如果要我用最簡單的描述來說明Deferred,我會說 就是callback的機制 但是它不單單只是callback的機制,還加了責任鍊(design pattern)的概念在裡面 這個設計讓它可以很容易的串來串去,像串燒一樣容易 XD 我們來看一下簡單的Deferred物件的使用例子 def sayHelloIn3Seconds(): # create a deferred object d = defer.Deferred() def sayHello(): print 'hello' # notify user d.callback(None) # call say hello 3 seconds later reactor.callLater(3, sayHello) return d 對於我們而言,sayHelloIn3Seconds是一個非同步的函數 這類的函數在Twsited裡都會回傳Deferred物件,而這個函數呼叫 它會負責設計讓它在完成任務後通知我們,方法就是透過它回傳來的Deferred物件 呼叫Deferred物件的callback函數就會呼叫它的callback鍊 使用的例子可能會像這樣 def helloFinish(result): print 'done.' d = sayHelloIn3Seconds() d. addCallback(helloFinish) addCallback的用意是增加callback函數到callback鍊裡 所以當這個函數完成了三秒後sayHello的非同步工作 它就會透過deferred物件來通知我們 所有Twsited的非同步工作都是靠這樣來讓我們得知 並且處理資料的 它的運作方式長得像這個樣子 執行完成,或發生錯誤 ╱\ ╱ \ ↙ ↘ callback errback │\ ╱│ │ \ ╱ │ │ ╳ │ │ ╱ \ │ ↓↙ ↘↓ callback errback │\ ╱│ │ \ ╱ │ │ ╳ │ │ ╱ \ │ ↓↙ ↘↓ callback errback 這圖的意思是 當工作完成時,它會呼叫callback這邊的函數,把非同步函數的result 丟給callback去處理,而每個callback的回傳值,又都會丟給下一個callback 當發生錯誤時,會呼叫errback這邊的函數,把error(Failure object) 丟給errback去處理,而每個errback的回傳值,又會丟給下一個errback處理 而callback中發生錯誤(丟出例外),或是回傳Failure object的話 就會丟給下一層的errback去處理 而errback中發生錯誤,或是回傳Failure object的話,也是會丟給下一層errback 但是如果當回傳的值不是Failure object 就會跳到下一層的callback去處理 接下來介紹這些串燒是如何的美味和容易 XD -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 118.170.5.243

07/25 22:35, , 1F
請問helloFinish是被addCallback丟到sayHello的callback裡嗎?
07/25 22:35, 1F
文章代碼(AID): #18W4nKry (Python)
文章代碼(AID): #18W4nKry (Python)