python開發(fā)實例之Python的Twisted框架中Deferred對象的詳細用法與實例
Deferred對象在Twsited框架中用于處理回調(diào),這對于依靠異步的Twisted來說十分重要,接下來我們就以實例解析Python的Twisted框架中Deferred對象的用法
Deferred對象結(jié)構(gòu)
Deferred由一系列成對的回調(diào)鏈組成,每一對都包含一個用于處理成功的回調(diào)(callbacks)和一個用于處理錯誤的回調(diào)(errbacks)。初始狀態(tài)下,deffereds將由兩個空回調(diào)鏈組成。在向其中添加回調(diào)時將總是成對添加。當異步處理中的結(jié)果返回時,Deferred將會啟動并以添加時的順序觸發(fā)回調(diào)鏈。
用實例也許更容易說明,首先來看看addCallback:
from twisted.internet.defer import Deferred def myCallback(result): print result d = Deferred() d.addCallback(myCallback) d.callback("Triggering callback.")
運行它將會得到如下結(jié)果:
Triggering callback.
上例中創(chuàng)建了一個deffered并利用其addCallback方法注冊一個用于處理成功的回調(diào)。d.callback會啟動deffered并調(diào)用callback鏈。傳入callback的參數(shù)也會被各callback鏈中的第一個函數(shù)接收到。
有addCallback,那另一個錯誤的分支,我想也能猜測到了那就是addErrorback,同樣來看個例子:
from twisted.internet.defer import Deferred def myErrback(failure): print failure d = Deferred() d.addErrback(myErrback) d.errback(ValueError("Triggering errback."))
運行它將會得到如下結(jié)果:
[Failure instance: Traceback (failure with no frames): <type 'exceptions.ValueError'>: Triggering errback.]
可以看出Twisted會把錯誤封裝在Failure里。
值得注意的是,在之前提到過注冊回調(diào)總是成對的。在使用d.addCallback和d.addErrorback方法時,我們看似只是添加了一個callback或一個errback。而實際上,為了完成這一級回調(diào)鏈的創(chuàng)建,這些方法還會為另一半注冊一個pass-through。要記住,回調(diào)鏈總是具有相同的長度。如果要分別指定這一級回調(diào)的callback和errback??梢允褂胐.addCallbacks方法:
d = Deferred() d.addCallbacks(myCallback, myErrback) d.callback("Triggering callback.")
進階示例
接下來就應(yīng)該來點更為實際的,那就是放進Reactor。先來看一個例子:
from twisted.internet import reactor, defer class HeadlineRetriever(object): def processHeadline(self, headline): if len(headline) > 50: self.d.errback(Exception("The headline ``%s'' is too long!" % (headline,))) else: self.d.callback(headline) def _toHTML(self, result): return "<h1>%s</h1>" % (result,) def getHeadline(self, input): self.d = defer.Deferred() reactor.callLater(1, self.processHeadline, input) self.d.addCallback(self._toHTML) return self.d def printData(result): print result reactor.stop() def printError(failure): print failure reactor.stop() h = HeadlineRetriever() d = h.getHeadline("Breaking News: Twisted Takes us to the Moon!") d.addCallbacks(printData, printError) reactor.run()
上例接收一個標題并對其進行處理,如果標題超長會返回超長的錯誤,否則將其轉(zhuǎn)為HTML并返回。
因所給的標題少于50個字符,故執(zhí)行以上代碼會得到如下返回:
<h1>Breaking News: Twisted Takes us to the Moon!</h1>
有一點值得注意的,上面用到了reactor的callLater方法,它可以用來做定時事件從而模擬一個異步的請求。
如果我們將標題變得很長,比如說:
h = HeadlineRetriever() d = h.getHeadline("1234567890"*6) d.addCallbacks(printData, printError)
那結(jié)果是可以遇見的
[Failure instance: Traceback (failure with no frames):
: The headline ``123456789012345678901234567890123456789012345678901234567890'' is too long!]
我們用圖看一下觸發(fā)流程:
- Deferreds中的關(guān)鍵之處
- Deferreds將會在調(diào)用其callback或errback時被觸發(fā);
- Deferreds僅能被觸發(fā)一次!如果嘗試多次觸發(fā)將會導致AlreadyCalledError異常;
- 第N級callback或errback中的Exceptions將會傳入第N+1級的errback中;如果沒有errback,則會拋出Unhandled Error。如果第N級callback或errback中沒有拋出Exception或返回Failure對象,那接下來將會由第N+1級中的callback進行處理;
- callback中返回的結(jié)果將會傳入下一級callback,并作為其第一個參數(shù);
- 如果傳入errback的錯誤不是一個Failure對象,那將會被自動包裝一次。
本文主要用實例講解了Python的Twisted框架中Deferred對象的詳細用法,更多關(guān)于Python的Twisted框架知識技巧請查看下面的相關(guān)鏈接
- python如何通過twisted搭建socket服務(wù)
- Python3.6中Twisted模塊安裝的問題與解決
- python安裝twisted的問題解析
- python如何通過twisted實現(xiàn)數(shù)據(jù)庫異步插入
- python基于twisted框架編寫簡單聊天室
- python 編程之twisted詳解及簡單實例
- Python 基于Twisted框架的文件夾網(wǎng)絡(luò)傳輸源碼
- 剖析Python的Twisted框架的核心特性
- 實例解析Python的Twisted框架中Deferred對象的用法
- 詳解Python的Twisted框架中reactor事件管理器的用法
- 使用Python的Twisted框架編寫非阻塞程序的代碼示例
- Python的Twisted框架中使用Deferred對象來管理回調(diào)函數(shù)
- 使用Python的Twisted框架構(gòu)建非阻塞下載程序的實例教程
- Python的Twisted框架上手前所必須了解的異步編程思想
- 使用Python的Treq on Twisted來進行HTTP壓力測試
- 利用Python的Twisted框架實現(xiàn)webshell密碼掃描器的教程
- 使用Python的Twisted框架實現(xiàn)一個簡單的服務(wù)器
- 使用Python的Twisted框架編寫簡單的網(wǎng)絡(luò)客戶端
相關(guān)文章
Python基于csv模塊實現(xiàn)讀取與寫入csv數(shù)據(jù)的方法
這篇文章主要介紹了Python基于csv模塊實現(xiàn)讀取與寫入csv數(shù)據(jù)的方法,結(jié)合實例形式分析了Python使用csv模塊針對csv文件的讀取與寫入相關(guān)操作技巧,需要的朋友可以參考下2018-01-01python os.listdir按文件存取時間順序列出目錄的實例
今天小編就為大家分享一篇python os.listdir按文件存取時間順序列出目錄的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-10-10python實現(xiàn)文本界面網(wǎng)絡(luò)聊天室
這篇文章主要為大家詳細介紹了python實現(xiàn)文本界面網(wǎng)絡(luò)聊天室,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-12-12使用Python快速搭建HTTP服務(wù)和文件共享服務(wù)的實例講解
今天小編就為大家分享一篇使用Python快速搭建HTTP服務(wù)和文件共享服務(wù)的實例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-06-06Python中l(wèi)ist列表添加元素的3種方法總結(jié)
這篇文章主要介紹了Python中l(wèi)ist列表添加元素的3種方法總結(jié),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-01-01