最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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)時將總是成對添加。當(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.")

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

進(jìn)階示例

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

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

如果我們將標(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!]

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

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

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

相關(guān)文章

  • LyScript實現(xiàn)內(nèi)存交換與差異對比的方法詳解

    LyScript實現(xiàn)內(nèi)存交換與差異對比的方法詳解

    LyScript?針對內(nèi)存讀寫函數(shù)的封裝功能并不多,只提供了內(nèi)存讀取和內(nèi)存寫入函數(shù)的封裝,本篇文章將繼續(xù)對API進(jìn)行封裝,實現(xiàn)一些在軟件逆向分析中非常實用的功能,需要的可以參考一下
    2022-08-08
  • python爬蟲容易學(xué)嗎

    python爬蟲容易學(xué)嗎

    在本篇文章里,小編給大家分享的是一篇關(guān)于python爬蟲是否容易學(xué)的相關(guān)知識點內(nèi)容,有興趣的朋友們可以閱讀下。
    2020-06-06
  • python創(chuàng)建多個logging日志文件的方法實現(xiàn)

    python創(chuàng)建多個logging日志文件的方法實現(xiàn)

    本文主要介紹了python創(chuàng)建多個logging日志文件的方法實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • 利用Python輕松生成藝術(shù)簽名

    利用Python輕松生成藝術(shù)簽名

    很多兄弟覺得自己字寫的不好什么的,沒事,咱們直接用python來生成。本文就將為大家介紹如何利用Python輕松生成藝術(shù)簽名,需要的可以參考一下
    2022-01-01
  • Python批量自動修改文件名,按指定的格式自動命名方式

    Python批量自動修改文件名,按指定的格式自動命名方式

    這篇文章主要介紹了Python批量自動修改文件名,按指定的格式自動命名方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • Django中反向生成models.py的實例講解

    Django中反向生成models.py的實例講解

    今天小編就為大家分享一篇Django中反向生成models.py的實例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05
  • PyTorch實現(xiàn)聯(lián)邦學(xué)習(xí)的基本算法FedAvg

    PyTorch實現(xiàn)聯(lián)邦學(xué)習(xí)的基本算法FedAvg

    這篇文章主要為大家介紹了PyTorch實現(xiàn)聯(lián)邦學(xué)習(xí)的基本算法FedAvg,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • Python Django獲取URL中的數(shù)據(jù)詳解

    Python Django獲取URL中的數(shù)據(jù)詳解

    這篇文章主要介紹了Python Django獲取URL中的數(shù)據(jù)詳解,小編覺得挺不錯的,這里分享給大家,供需要的朋友參考
    2021-11-11
  • Python?中設(shè)置請求的最大重試次數(shù)示例代碼

    Python?中設(shè)置請求的最大重試次數(shù)示例代碼

    本篇文章介紹了為什么我們會收到錯誤消息,指出超出了最大重試次數(shù),以及我們?nèi)绾卧?Python?中為請求設(shè)置?max_retries,本文通過示例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2023-06-06
  • Python模塊pexpect安裝及使用流程

    Python模塊pexpect安裝及使用流程

    Pexpect使Python成為控制其他應(yīng)用程序的更好工具,這篇文章主要介紹了Python模塊之pexpect的安裝及使用流程,需要的朋友可以參考下
    2022-02-02

最新評論

华池县| 固始县| 沅陵县| 临潭县| 永康市| 宜阳县| 大邑县| 绵阳市| 渑池县| 公安县| 遵义县| 姚安县| 绥滨县| 大安市| 长岭县| 石柱| 察哈| 凤阳县| 永嘉县| 岗巴县| 邯郸市| 曲水县| 平顶山市| 溆浦县| 哈密市| 平潭县| 久治县| 克东县| 万盛区| 黎平县| 深泽县| 黑山县| 洛宁县| 泉州市| 上饶县| 茶陵县| 宁都县| 丹阳市| 鹿泉市| 新宾| 普定县|