[教學] Twsited的骨幹 : Deferred
接著來介紹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
07/25 22:35, 1F
Python 近期熱門文章
PTT數位生活區 即時熱門文章