twisted笔记一:Deferred笔记(搬运)
最近在研究twisted,但官方文档写的太简洁,网上信息太少,于是*找到了一位大佬的博客,找到了一些信息。
转自:https://sites.google.com/site/mypynotes/twisted-1/deferred
Deferred的简单套路
从twisted的文档入手,将Deferred独立出来简单的说明作用与使用方法,这样更能快速对Deferred有深刻的了解。
一、学习资料
-
主要参考资料官方文档http://twistedmatrix.com/projects/core/documentation/howto/deferredindepth.html关联译文
http://wiki.woodpecker.org.cn/moin/twistedTUT00?action=AttachFile&do=get&target=deferred_tutorial.html(此链接将会下载离线文档) - 关联资源http://wiki.woodpecker.org.cn/ moin/TwistedTUT
二、Deferred的作用
Deferred的主要作用可以用一句话比较形象说明,“不要打电话给我,我会打给你的(Don’t Call Us, We’ll Call You) ”。相当于做好计划后,执行交给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可以同时注册处理正常结束和例外结束的函数。
def deferredExample():
d = defer.Deferred()
d.addCallback(failAtHandlingResult)
d.addCallbacks(yesDecision, noDecisionPassthru)
d.addCallback(handleResult) # - A -
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的使用方法及其事件响应机制。