国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

實例解析Python的Twisted框架中Deferred對象的用法

2019-11-25 16:46:47
字體:
供稿:網(wǎng)友

Deferred對象結(jié)構(gòu)
Deferred由一系列成對的回調(diào)鏈組成,每一對都包含一個用于處理成功的回調(diào)(callbacks)和一個用于處理錯誤的回調(diào)(errbacks)。初始狀態(tài)下,deffereds將由兩個空回調(diào)鏈組成。在向其中添加回調(diào)時將總是成對添加。當(dāng)異步處理中的結(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.")

運(yùn)行它將會得到如下結(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."))

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

復(fù)制代碼 代碼如下:

[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。可以使用d.addCallbacks方法:
d = Deferred()d.addCallbacks(myCallback, myErrback)d.callback("Triggering callback.")
那么...今天就先到這里。

進(jìn)階示例
接下來就應(yīng)該來點(diǎn)更為實際的,那就是放進(jìn)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()

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

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

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

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

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

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

那結(jié)果是可以遇見的:

復(fù)制代碼 代碼如下:

[Failure instance: Traceback (failure with no frames): <type 'exceptions.Exception'>: The headline ``123456789012345678901234567890123456789012345678901234567890'' is too long!]

我們用圖看一下觸發(fā)流程:
2016525120051862.jpg (547×368)

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

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 射阳县| 明星| 潞西市| 阜平县| 宜兰县| 饶阳县| 荔波县| 五华县| 孟村| 武隆县| 新蔡县| 无极县| 景泰县| 濮阳市| 琼结县| 子洲县| 论坛| 土默特左旗| 台北县| 岑溪市| 深圳市| 沾益县| 衡阳市| 玉环县| 哈密市| 南华县| 漳平市| 安西县| 密云县| 泌阳县| 柳州市| 湘阴县| 咸宁市| 安丘市| 西林县| 溧水县| 吐鲁番市| 宣化县| 罗定市| 灵台县| 平顺县|