欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2020年03月19日 08:49:26   作者:老程序員阿福  
這篇文章主要介紹了python開發(fā)實(shí)例之Python的Twisted框架中Deferred對(duì)象的詳細(xì)用法與實(shí)例,需要的朋友可以參考下

Deferred對(duì)象在Twsited框架中用于處理回調(diào),這對(duì)于依靠異步的Twisted來(lái)說(shuō)十分重要,接下來(lái)我們就以實(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í)例也許更容易說(shuō)明,首先來(lái)看看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,同樣來(lái)看個(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里。

值得注意的是,在之前提到過(guò)注冊(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)鏈總是具有相同的長(zhǎng)度。如果要分別指定這一級(jí)回調(diào)的callback和errback??梢允褂胐.addCallbacks方法:

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

進(jìn)階示例

接下來(lái)就應(yīng)該來(lái)點(diǎn)更為實(shí)際的,那就是放進(jìn)Reactor。先來(lái)看一個(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)題超長(zhǎng)會(huì)返回超長(zhǎng)的錯(cuò)誤,否則將其轉(zhuǎn)為HTML并返回。

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

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

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

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

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將會(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ì)象,那接下來(lái)將會(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)鏈接

相關(guān)文章

  • Python基于csv模塊實(shí)現(xiàn)讀取與寫入csv數(shù)據(jù)的方法

    Python基于csv模塊實(shí)現(xiàn)讀取與寫入csv數(shù)據(jù)的方法

    這篇文章主要介紹了Python基于csv模塊實(shí)現(xiàn)讀取與寫入csv數(shù)據(jù)的方法,結(jié)合實(shí)例形式分析了Python使用csv模塊針對(duì)csv文件的讀取與寫入相關(guān)操作技巧,需要的朋友可以參考下
    2018-01-01
  • python字符串中匹配數(shù)字的正則表達(dá)式

    python字符串中匹配數(shù)字的正則表達(dá)式

    正則表達(dá)式是一個(gè)特殊的字符序列,它能幫助你方便的檢查一個(gè)字符串是否與某種模式匹配。這篇文章主要介紹了python字符串中匹配數(shù)字的正則表達(dá)式 ,需要的朋友可以參考下
    2019-07-07
  • python可視化實(shí)現(xiàn)KNN算法

    python可視化實(shí)現(xiàn)KNN算法

    這篇文章主要為大家詳細(xì)介紹了python可視化實(shí)現(xiàn)KNN算法,通過(guò)繪圖工具M(jìn)atplotlib包可視化實(shí)現(xiàn)機(jī)器學(xué)習(xí)中的KNN算法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • python 文件下載之?dāng)帱c(diǎn)續(xù)傳的實(shí)現(xiàn)

    python 文件下載之?dāng)帱c(diǎn)續(xù)傳的實(shí)現(xiàn)

    用python進(jìn)行文件下載的時(shí)候,一旦出現(xiàn)網(wǎng)絡(luò)波動(dòng)問(wèn)題,導(dǎo)致文件下載到一半。如果將下載不完全的文件刪掉,那么又需要從頭開始,如果連續(xù)網(wǎng)絡(luò)波動(dòng),是不是要頭禿了。本文提供斷點(diǎn)續(xù)傳下載工具方法,希望可以幫助到你
    2021-11-11
  • Python 專題一 函數(shù)的基礎(chǔ)知識(shí)

    Python 專題一 函數(shù)的基礎(chǔ)知識(shí)

    本文從系統(tǒng)提供的內(nèi)部函數(shù)、第三方提供函數(shù)庫(kù)+簡(jiǎn)單爬出代碼及安裝httplib2模塊過(guò)程和用戶自定函數(shù)三個(gè)方面進(jìn)行講述。具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧
    2017-03-03
  • python os.listdir按文件存取時(shí)間順序列出目錄的實(shí)例

    python os.listdir按文件存取時(shí)間順序列出目錄的實(shí)例

    今天小編就為大家分享一篇python os.listdir按文件存取時(shí)間順序列出目錄的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-10-10
  • python實(shí)現(xiàn)文本界面網(wǎng)絡(luò)聊天室

    python實(shí)現(xiàn)文本界面網(wǎng)絡(luò)聊天室

    這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)文本界面網(wǎng)絡(luò)聊天室,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • 使用Python快速搭建HTTP服務(wù)和文件共享服務(wù)的實(shí)例講解

    使用Python快速搭建HTTP服務(wù)和文件共享服務(wù)的實(shí)例講解

    今天小編就為大家分享一篇使用Python快速搭建HTTP服務(wù)和文件共享服務(wù)的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-06-06
  • Python中l(wèi)ist列表添加元素的3種方法總結(jié)

    Python中l(wèi)ist列表添加元素的3種方法總結(jié)

    這篇文章主要介紹了Python中l(wèi)ist列表添加元素的3種方法總結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • PYTHON EVAL的用法及注意事項(xiàng)解析

    PYTHON EVAL的用法及注意事項(xiàng)解析

    這篇文章主要介紹了PYTHON EVAL的用法及注意事項(xiàng)解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09

最新評(píng)論