中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》
  • 首頁 > 
  • 教程 > 
  • 開發技術 > 
  • python開發實例之Python的Twisted框架中Deferred對象的詳細用法與實例

python開發實例之Python的Twisted框架中Deferred對象的詳細用法與實例

發布時間:2020-09-26 03:43:14 來源:腳本之家 閱讀:171 作者:老程序員阿福 欄目:開發技術

Deferred對象在Twsited框架中用于處理回調,這對于依靠異步的Twisted來說十分重要,接下來我們就以實例解析Python的Twisted框架中Deferred對象的用法

Deferred對象結構

Deferred由一系列成對的回調鏈組成,每一對都包含一個用于處理成功的回調(callbacks)和一個用于處理錯誤的回調(errbacks)。初始狀態下,deffereds將由兩個空回調鏈組成。在向其中添加回調時將總是成對添加。當異步處理中的結果返回時,Deferred將會啟動并以添加時的順序觸發回調鏈。

用實例也許更容易說明,首先來看看addCallback:

from twisted.internet.defer import Deferred
 
def myCallback(result):
 print result
 
d = Deferred()
d.addCallback(myCallback)
d.callback("Triggering callback.")

運行它將會得到如下結果:

Triggering callback.

上例中創建了一個deffered并利用其addCallback方法注冊一個用于處理成功的回調。d.callback會啟動deffered并調用callback鏈。傳入callback的參數也會被各callback鏈中的第一個函數接收到。

有addCallback,那另一個錯誤的分支,我想也能猜測到了那就是addErrorback,同樣來看個例子:

from twisted.internet.defer import Deferred
 
def myErrback(failure):
 print failure
 
d = Deferred()
d.addErrback(myErrback)
d.errback(ValueError("Triggering errback."))

運行它將會得到如下結果:

[Failure instance: Traceback (failure with no frames): <type 'exceptions.ValueError'>: Triggering errback.]

可以看出Twisted會把錯誤封裝在Failure里。

值得注意的是,在之前提到過注冊回調總是成對的。在使用d.addCallback和d.addErrorback方法時,我們看似只是添加了一個callback或一個errback。而實際上,為了完成這一級回調鏈的創建,這些方法還會為另一半注冊一個pass-through。要記住,回調鏈總是具有相同的長度。如果要分別指定這一級回調的callback和errback。可以使用d.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 "<h2>%s</h2>" % (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()

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

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

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

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

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

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

那結果是可以遇見的

[Failure instance: Traceback (failure with no frames): : The headline ``123456789012345678901234567890123456789012345678901234567890'' is too long!]

python開發實例之Python的Twisted框架中Deferred對象的詳細用法與實例

我們用圖看一下觸發流程:

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

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

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

外汇| 延川县| 呼伦贝尔市| 贞丰县| 中山市| 三都| 鄂温| 玛曲县| 武清区| 麟游县| 乐都县| 砚山县| 茶陵县| 遂川县| 临江市| 北辰区| 虞城县| 灵寿县| 陇南市| 松原市| 开阳县| 海门市| 罗平县| 阜新市| 鹤峰县| 临沧市| 靖州| 登封市| 贵州省| 崇明县| 耒阳市| 丹寨县| 马山县| 和田县| 伽师县| 和政县| 宣威市| 邵武市| 锡林浩特市| 宁都县| 寿阳县|