久久r热视频,国产午夜精品一区二区三区视频,亚洲精品自拍偷拍,欧美日韩精品二区

您的位置:首頁技術(shù)文章
文章詳情頁

python開發(fā)實(shí)例之Python的Twisted框架中Deferred對(duì)象的詳細(xì)用法與實(shí)例

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

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

Deferred對(duì)象結(jié)構(gòu)

Deferred由一系列成對(duì)的回調(diào)鏈組成,每一對(duì)都包含一個(gè)用于處理成功的回調(diào)(callbacks)和一個(gè)用于處理錯(cuò)誤的回調(diào)(errbacks)。初始狀態(tài)下,deffereds將由兩個(gè)空回調(diào)鏈組成。在向其中添加回調(diào)時(shí)將總是成對(duì)添加。當(dāng)異步處理中的結(jié)果返回時(shí),Deferred將會(huì)啟動(dòng)并以添加時(shí)的順序觸發(fā)回調(diào)鏈。

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

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

運(yùn)行它將會(huì)得到如下結(jié)果:

Triggering callback.

上例中創(chuàng)建了一個(gè)deffered并利用其addCallback方法注冊(cè)一個(gè)用于處理成功的回調(diào)。d.callback會(huì)啟動(dòng)deffered并調(diào)用callback鏈。傳入callback的參數(shù)也會(huì)被各callback鏈中的第一個(gè)函數(shù)接收到。

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

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

運(yùn)行它將會(huì)得到如下結(jié)果:

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

可以看出Twisted會(huì)把錯(cuò)誤封裝在Failure里。

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

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

進(jìn)階示例

接下來就應(yīng)該來點(diǎn)更為實(shí)際的,那就是放進(jìn)Reactor。先來看一個(gè)例子:

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()

上例接收一個(gè)標(biāo)題并對(duì)其進(jìn)行處理,如果標(biāo)題超長會(huì)返回超長的錯(cuò)誤,否則將其轉(zhuǎn)為HTML并返回。

因所給的標(biāo)題少于50個(gè)字符,故執(zhí)行以上代碼會(huì)得到如下返回:

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

有一點(diǎn)值得注意的,上面用到了reactor的callLater方法,它可以用來做定時(shí)事件從而模擬一個(gè)異步的請(qǐng)求。

如果我們將標(biāo)題變得很長,比如說:

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!]

python開發(fā)實(shí)例之Python的Twisted框架中Deferred對(duì)象的詳細(xì)用法與實(shí)例

我們用圖看一下觸發(fā)流程:

Deferreds中的關(guān)鍵之處 Deferreds將會(huì)在調(diào)用其callback或errback時(shí)被觸發(fā); Deferreds僅能被觸發(fā)一次!如果嘗試多次觸發(fā)將會(huì)導(dǎo)致AlreadyCalledError異常; 第N級(jí)callback或errback中的Exceptions將會(huì)傳入第N+1級(jí)的errback中;如果沒有errback,則會(huì)拋出Unhandled Error。如果第N級(jí)callback或errback中沒有拋出Exception或返回Failure對(duì)象,那接下來將會(huì)由第N+1級(jí)中的callback進(jìn)行處理; callback中返回的結(jié)果將會(huì)傳入下一級(jí)callback,并作為其第一個(gè)參數(shù); 如果傳入errback的錯(cuò)誤不是一個(gè)Failure對(duì)象,那將會(huì)被自動(dòng)包裝一次。

本文主要用實(shí)例講解了Python的Twisted框架中Deferred對(duì)象的詳細(xì)用法,更多關(guān)于Python的Twisted框架知識(shí)技巧請(qǐng)查看下面的相關(guān)鏈接

標(biāo)簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: 虹口区| 弥勒县| 三台县| 佛山市| 开化县| 永福县| 黑水县| 达州市| 新巴尔虎右旗| 齐齐哈尔市| 广州市| 綦江县| 新津县| 兰考县| 观塘区| 施秉县| 多伦县| 财经| 桃源县| 敦煌市| 弋阳县| 洪雅县| 洪洞县| 新郑市| 巴中市| 雅江县| 北海市| 平塘县| 龙陵县| 浦北县| 会理县| 临泽县| 阜南县| 缙云县| 新建县| 屯门区| 电白县| 隆化县| 蓬溪县| 朝阳市| 仲巴县|