递延对象在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”太长了!]
引用>
我们用图看一下触发流程:
<李>延迟中的关键之处李> <李>延期将会在调用其回调或errback时被触发;李> <李>延迟仅能被触发一次!如果尝试多次触发将会导致AlreadyCalledError异常;李
python开发实例之python的扭曲的框架中递延对象的详细用法与实例