python开发实例之python的扭曲的框架中递延对象的详细用法与实例

  

递延对象在Twsited框架中用于处理回调,这对于依靠异步的扭曲来说十分重要,接下来我们就以实例解析Python的扭曲的框架中递延对象的用法

  

递延对象结构

  

延迟由一系列成对的回调链组成,每一对都包含一个用于处理成功的回调(回调)和一个用于处理错误的回调(errback)。初始状态下,deffereds将由两个空回调链组成。在向其中添加回调时将总是成对添加。当异步处理中的结果返回时,延期将会启动并以添加时的顺序触发回调链。

  

用实例也许更容易说明,首先来看看addCallback:

        从twisted.internet.defer进口延期      def myCallback(结果):   打印结果      d=延迟()   d.addCallback (myCallback)   d。回调(“触发回调”。)   之前      

运行它将会得到如下结果:

  
  

触发回调。      

上例中创建了一个deffered并利用其addCallback方法注册一个用于处理成功的回调.d.callback会启动deffered并调用回调链。传入回调的参数也会被各回调链中的第一个函数接收到。

  

有addCallback,那另一个错误的分支,我想也能猜测到了那就是addErrorback,同样来看个例子:

        从twisted.internet.defer进口延期      def myErrback(失败):   打印失败      d=延迟()   d.addErrback (myErrback)   d。errback (ValueError(“触发errback”。)   之前      

运行它将会得到如下结果:

  
  

[失败实例:回溯(失败没有帧):& lt;类型的exceptions.ValueError祝辞:触发errback。)

     

可以看出扭曲会把错误封装在失败里。

  

值得注意的是,在之前提到过注册回调总是成对的。在使用d.addCallback和d.addErrorback方法时,我们看似只是添加了一个回调或一个errback。而实际上,为了完成这一级回调链的创建,这些方法还会为另一半注册一个直通。要记住,回调链总是具有相同的长度。如果要分别指定这一级回调的调和errback。可以使用d.addCallbacks方法:

        d=延迟()   d。addcallback (myCallback myErrback)   d。回调(“触发回调”。)      

进阶示例

  

接下来就应该来点更为实际的,那就是放进反应堆。先来看一个例子:

        从twisted.internet进口反应堆,推迟      类HeadlineRetriever(对象):   def processHeadline(自我,标题):   如果len(标题)比;50:   self.d。errback(异常(“标题“% s”太长了!”%(标题)))   其他:   self.d.callback(标题)      def _toHTML(自我,结果):   返回“& lt; h2> % s”%(结果)      def getHeadline(自我、输入):   自我。d=defer.Deferred ()   反应堆。callLater(自我。processHeadline,输入)   self.d.addCallback (self._toHTML)   返回self.d      def printData(结果):   打印结果   reactor.stop ()      def printError(失败):   打印失败   reactor.stop ()      h=HeadlineRetriever ()   d=h。getHeadline(“突发新闻:扭带我们到月球!”)   d。addcallback (printData printError)      reactor.run ()   之前      

上例接收一个标题并对其进行处理,如果标题超长会返回超长的错误,否则将其转为HTML并返回。

  

因所给的标题少于50个字符,故执行以上代码会得到如下返回:

  
  

& lt; h2>突发新闻:扭带我们到月球! & lt;/h2>

     

有一点值得注意的,上面用到了反应堆的callLater方法,它可以用来做定时事件从而模拟一个异步的请求。

  

如果我们将标题变得很长,比如说:

        h=HeadlineRetriever ()   d=h.getHeadline (“1234567890”* 6)   d。addcallback (printData printError)   之前      

那结果是可以遇见的

  
  

[失败实例:回溯(失败没有帧)::标题“123456789012345678901234567890123456789012345678901234567890”太长了!]

     

 python开发实例之python的扭曲的框架中递延对象的详细用法与实例

  

我们用图看一下触发流程: