色综合图-色综合图片-色综合图片二区150p-色综合图区-玖玖国产精品视频-玖玖香蕉视频

您的位置:首頁技術文章
文章詳情頁

python開發實例之Python的Twisted框架中Deferred對象的詳細用法與實例

瀏覽:83日期:2022-08-01 18:51:17

Deferred對象在Twsited框架中用于處理回調,這對于依靠異步的Twisted來說十分重要,接下來我們就以實例解析Python的Twisted框架中Deferred對象的用法

Deferred對象結構

Deferred由一系列成對的回調鏈組成,每一對都包含一個用于處理成功的回調(callbacks)和一個用于處理錯誤的回調(errbacks)。初始狀態下,deffereds將由兩個空回調鏈組成。在向其中添加回調時將總是成對添加。當異步處理中的結果返回時,Deferred將會啟動并以添加時的順序觸發回調鏈。

用實例也許更容易說明,首先來看看addCallback:

from twisted.internet.defer import Deferred def myCallback(result): print result d = Deferred()d.addCallback(myCallback)d.callback('Triggering callback.')

運行它將會得到如下結果:

Triggering callback.

上例中創建了一個deffered并利用其addCallback方法注冊一個用于處理成功的回調。d.callback會啟動deffered并調用callback鏈。傳入callback的參數也會被各callback鏈中的第一個函數接收到。

有addCallback,那另一個錯誤的分支,我想也能猜測到了那就是addErrorback,同樣來看個例子:

from twisted.internet.defer import Deferred def myErrback(failure): print failure d = Deferred()d.addErrback(myErrback)d.errback(ValueError('Triggering errback.'))

運行它將會得到如下結果:

[Failure instance: Traceback (failure with no frames): <type ’exceptions.ValueError’>: Triggering errback.]

可以看出Twisted會把錯誤封裝在Failure里。

值得注意的是,在之前提到過注冊回調總是成對的。在使用d.addCallback和d.addErrorback方法時,我們看似只是添加了一個callback或一個errback。而實際上,為了完成這一級回調鏈的創建,這些方法還會為另一半注冊一個pass-through。要記住,回調鏈總是具有相同的長度。如果要分別指定這一級回調的callback和errback。可以使用d.addCallbacks方法:

d = Deferred()d.addCallbacks(myCallback, myErrback)d.callback('Triggering callback.')

進階示例

接下來就應該來點更為實際的,那就是放進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()

上例接收一個標題并對其進行處理,如果標題超長會返回超長的錯誤,否則將其轉為HTML并返回。

因所給的標題少于50個字符,故執行以上代碼會得到如下返回:

<h1>Breaking News: Twisted Takes us to the Moon!</h1>

有一點值得注意的,上面用到了reactor的callLater方法,它可以用來做定時事件從而模擬一個異步的請求。

如果我們將標題變得很長,比如說:

h = HeadlineRetriever()d = h.getHeadline('1234567890'*6)d.addCallbacks(printData, printError)

那結果是可以遇見的

[Failure instance: Traceback (failure with no frames): : The headline ``123456789012345678901234567890123456789012345678901234567890’’ is too long!]

python開發實例之Python的Twisted框架中Deferred對象的詳細用法與實例

我們用圖看一下觸發流程:

Deferreds中的關鍵之處 Deferreds將會在調用其callback或errback時被觸發; Deferreds僅能被觸發一次!如果嘗試多次觸發將會導致AlreadyCalledError異常; 第N級callback或errback中的Exceptions將會傳入第N+1級的errback中;如果沒有errback,則會拋出Unhandled Error。如果第N級callback或errback中沒有拋出Exception或返回Failure對象,那接下來將會由第N+1級中的callback進行處理; callback中返回的結果將會傳入下一級callback,并作為其第一個參數; 如果傳入errback的錯誤不是一個Failure對象,那將會被自動包裝一次。

本文主要用實例講解了Python的Twisted框架中Deferred對象的詳細用法,更多關于Python的Twisted框架知識技巧請查看下面的相關鏈接

標簽: Python 編程
相關文章:
主站蜘蛛池模板: 男人桶女人暴爽的视频 | 免费视频99 | 国产日本三级欧美三级妇三级四 | 国产欧美日韩在线一区二区不卡 | theav视频在线观看 | 成人在线视频免费观看 | 日本九六视频 | 色老头久久网 | 日本久久香蕉一本一道 | 欧美成视频无需播放器 | 美女张开腿让男人桶爽动漫视频 | 99久久精品国产片久人 | 精品欧美日韩一区二区 | 亚久久伊人精品青青草原2020 | 欧美日韩亚洲国产精品 | 久久精品国产亚洲网址 | 久久精品免费一区二区视 | 玖玖色视频 | 成人在线观看一区 | 又摸又揉又黄又爽的视频 | 91欧美一区二区三区综合在线 | 久久a热6 | 日本最色视频 | 久久国内精品 | 精品久久久久久久久中文字幕 | 亚洲三级网站 | 欧美在线视频一区二区 | 亚洲视频网址 | 免费中国一级啪啪片 | 国产高清厕所盗摄视频 | 亚洲高清成人欧美动作片 | 欧美日韩一区二区三区免费 | 91精品免费国产高清在线 | 一区二区三区四区在线免费观看 | 免费视频 久久久 | 亚洲一区免费 | 久久国产精品二国产精品 | 亚洲高清一区二区三区久久 | 欧美精品色视频 | 国产成人久久精品一区二区三区 | 亚洲精品aaa |