Deferred对象在Twsited框架中用于处理回调,这对于依靠异步的Twisted来说十分重要,接下来我们就以实例解析Python的Twisted框架中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 "<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()
上例接收一个标题并对其进行处理,如果标题超长会返回超长的错误,否则将其转为HTML并返回。
因所给的标题少于50个字符,故执行以上代码会得到如下返回:
<h1>Breaking News: Twisted Takes us to the Moon!</h1>
有一点值得注意的,上面用到了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的Twisted框架中Deferred对象的详细用法,更多关于Python的Twisted框架知识技巧请查看下面的相关链接
本文向大家介绍python GUI库图形界面开发之PyQt5复选框控件QCheckBox详细使用方法与实例,包括了python GUI库图形界面开发之PyQt5复选框控件QCheckBox详细使用方法与实例的使用技巧和注意事项,需要的朋友参考一下 QCheckBox类中常用方法如表 方法 描述 setChecked() 设置复选框的状态,设置为True表示选中,False表示取消选中的复选框 se
本文向大家介绍详解 Python 与文件对象共事的实例,包括了详解 Python 与文件对象共事的实例的使用技巧和注意事项,需要的朋友参考一下 详解 Python 与文件对象共事的实例 Python 有一个内置函数,open,用来打开在磁盘上的文件。open 返回一个文件对象,它拥有一些方法和属性,可以得到被打开文件的信息,以及对被打开文件进行操作。 (1) open 方法可以接收三个参数:文件
本文向大家介绍Python编程之event对象的用法实例分析,包括了Python编程之event对象的用法实例分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Python编程中event对象的用法。分享给大家供大家参考,具体如下: Python提供了Event对象用于线程间通信,它是由线程设置的信号标志,如果信号标志位为假,则线程等待直到信号被其他线程设置成真。这一点似乎和window
问题内容: 这发生在python2.7中 我正在研究python中元类的想法,几乎所有教程都将对象引用为python中类的实例。但是,在使用类A():定义类的形式时,我看到了: 这意味着当从不是对象固有的类创建实例时,该实例是实例,但是当类是对象固有的类时,该类的实例是对象吗? 谁能解释其中的区别?在现实生活中,我应该使用哪一个? 谢谢! 问题答案: 这是新样式类和旧样式类之间的区别,在文档中对此
本文向大家介绍python GUI库图形界面开发之PyQt5工具栏控件QToolBar的详细使用方法与实例,包括了python GUI库图形界面开发之PyQt5工具栏控件QToolBar的详细使用方法与实例的使用技巧和注意事项,需要的朋友参考一下 PyQt5工具栏控件QToolBar介绍 QToolBar控件是由文本按钮,图标或其他小控件按钮组成的可移动面板,通常位于菜单栏下方 QToolBar类
本文向大家介绍Python中的闭包详细介绍和实例,包括了Python中的闭包详细介绍和实例的使用技巧和注意事项,需要的朋友参考一下 一、闭包 来自wiki: 闭包(Closure)是词法闭包(Lexical Closure)的简称,是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外。所以,有另一种说法认为闭包是由函数和与其相关的引用环境组合而成的实