Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4999516
  • 博文数量: 921
  • 博客积分: 16037
  • 博客等级: 上将
  • 技术积分: 8469
  • 用 户 组: 普通用户
  • 注册时间: 2006-04-05 02:08
文章分类

全部博文(921)

文章存档

2020年(1)

2019年(3)

2018年(3)

2017年(6)

2016年(47)

2015年(72)

2014年(25)

2013年(72)

2012年(125)

2011年(182)

2010年(42)

2009年(14)

2008年(85)

2007年(89)

2006年(155)

分类: Python/Ruby

2011-11-20 23:57:01

Deferred筆記一

Deferred 的簡單套路

     從twisted的文檔入手,將Deferred獨立出來簡單的說明作用與使用方法,這樣更能快速對Deferred 有深刻的了解。

一、學習資料
     1、主要參考資料

          官方文檔 http://twistedmatrix.com/projects/core/documentation/howto/deferredindepth.html
         關聯譯文  (此鏈接將會下載離線文檔)
   
     2、關聯資源
        

二、Deferred的作用
    Deferred的主要作用可以 用一句話比較形象說明,“”。相當於做好計劃後,執行交給Deferred,完成後再找我,我可要到一邊Happy去了。
    它會根據callback運行結果(正常、發生例外)從callback鏈表中選擇執行已註冊的相應的 callback函數,從而實現事件方式來驅動程序。
    callback的運行不影響主程序的運行,Deferred.callback執行後馬上返回。(這點有待在後面證明)

三、Deferred實例
    from twisted.internet import defer
    d=defer.Deferred()
    實例化後就可以對Deferred進行操作。

四、callback鏈表

    鏈表是用來放置callback函數,鏈表中的函數可以響應三類事件,正常結束、例外結束、任意(包括前面兩者),它們分別用addCallback、addErrback、addBoth註冊到鏈表中。也就是說函數正常結束返回調用addCallback註冊的函數,發生例外則調用addErrback註冊的函數,使用addBoth註冊的函數無論返回什麼結果都會被調用。

五、callback函數註冊
    除了上面提過的addCallback、addErrback、addBoth三個註冊函數外,還有另外一個 addCallbacks可以同時註冊處理正常結束和例外結束的函數。

 

  1. def deferredExample():
  2.     d = defer.Deferred()
  3.     d.addCallback(failAtHandlingResult)
  4.     d.addCallbacks(yesDecision, noDecisionPassthru)
  5.     d.addCallback(handleResult) # - A -
  6.     d.addErrback(handleFailure)

 上面代碼中第4行的addCallbacks效果如
     d.addCallback(yesDecision)
    d.addErrback(noDecisionPassthru)

    另外,我們也可以將註冊過程寫成下面形式。
     d=refer.Deferred().addCallback(failAtHandlingResult).addCallbacks(yesDecision,  noDecisionPassthru).addCallback(handleResult).addErrback(handleFailure)

六、callback鏈執行順序
    Deferred的鏈表是按順序從第一個註冊函數開始直到最後一個函數。如果發生例外時,有多個例外處理函數,則會調用發生例外函數下面第一個例外處理函數。後面的例外處理函數將不會被調用,除非第一個例外處理函數將這個例外向下傳遞。

七、其它一些特性
    Deferred實例中還有另外一些函數,如 pause,unpause,setTimeout,timeoutCall,chainDeferred,這些將留作下一步的測試。
    另外還沒涉及到的是Deferred上一級的defer庫中的函數及其它類的使用,從一些代碼看來這些函數將會進一步有利於 Deferred的應用,但這也有待後面的進上步學習。
 
八、總結
    經過Deferred are beautiful一節學習,了解Deferred的使用方法及其事件響應機制。

阅读(772) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~