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

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

 更新時間:2016年05月25日 12:04:26   作者:Danny Man  
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)時將總是成對添加。當異步處理中的結(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.")
那么...今天就先到這里。

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

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

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

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

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

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

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

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

復制代碼 代碼如下:

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

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

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

相關文章

  • python與sqlite3實現(xiàn)解密chrome cookie實例代碼

    python與sqlite3實現(xiàn)解密chrome cookie實例代碼

    這篇文章主要介紹了python與sqlite3實現(xiàn)解密chrome cookie實例代碼,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下
    2018-01-01
  • python中str、bytes、十六進制字符串之間的相互轉(zhuǎn)換方法

    python中str、bytes、十六進制字符串之間的相互轉(zhuǎn)換方法

    這篇文章主要介紹了在Python中字符串(str)、字節(jié)序列(bytes)以及十六進制字符串之間的轉(zhuǎn)換方法,包括如何使用.encode()、.decode()、bytes.fromhex()和.hex()方法進行轉(zhuǎn)換,需要的朋友可以參考下
    2025-03-03
  • Python有參函數(shù)使用代碼實例

    Python有參函數(shù)使用代碼實例

    這篇文章主要介紹了Python有參函數(shù)使用代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-01-01
  • 搞定這套Python爬蟲面試題(面試會so easy)

    搞定這套Python爬蟲面試題(面試會so easy)

    Python 是一門開源的解釋性語言,相比 Java C++ 等語言,Python 具有動態(tài)特性,非常靈活。這篇文章主要介紹了搞定這套Python爬蟲面試題,面試會so easy,需要的朋友可以參考下
    2019-04-04
  • python?windows安裝cuda+cudnn+pytorch教程

    python?windows安裝cuda+cudnn+pytorch教程

    這篇文章主要介紹了python?windows安裝cuda+cudnn+pytorch教程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • pytest接口測試之fixture傳參數(shù)request的使用

    pytest接口測試之fixture傳參數(shù)request的使用

    本文主要介紹了pytest接口測試之fixture傳參數(shù)request的使用,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • Python實現(xiàn)打乒乓小游戲

    Python實現(xiàn)打乒乓小游戲

    這篇文章主要為大家詳細介紹了Python實現(xiàn)打乒乓小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • 便捷提取python導入包的屬性方法

    便捷提取python導入包的屬性方法

    今天小編就為大家分享一篇便捷提取python導入包的屬性方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-10-10
  • 在Python中os.fork()產(chǎn)生子進程的例子

    在Python中os.fork()產(chǎn)生子進程的例子

    今天小編就為大家分享一篇在Python中os.fork()產(chǎn)生子進程的例子,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-08-08
  • 使用apidocJs快速生成在線文檔的實例講解

    使用apidocJs快速生成在線文檔的實例講解

    下面小編就為大家分享一篇使用apidocJs快速生成在線文檔的實例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-02-02

最新評論

昌乐县| 黄陵县| 卢湾区| 顺义区| 炉霍县| 新营市| 互助| 泰兴市| 淮阳县| 普兰县| 南宫市| 潞城市| 无极县| 和林格尔县| 孟津县| 长海县| 和田县| 武城县| 兴安盟| 墨脱县| 高唐县| 门源| 揭西县| 金乡县| 永康市| 固原市| 中牟县| 吉木萨尔县| 安仁县| 泰宁县| 临洮县| 田东县| 宽城| 从江县| 虹口区| 德格县| 桦南县| 重庆市| 襄汾县| 蓬溪县| 晋宁县|