twisted 6 大话deferred

http://twistedsphinx.funsize.net/projects/core/howto/deferredindepth.html


1. 没有等待,就没有事件。设备的“监听”功能是一切事件的来源。

一句话道明deferred的精髓

Normally, a function would create a deferred and hand it back to you when you request an operation that needs to wait for an event for completion. The object you called then does d.callback(result) when the results are in.


2. 

addBoth: the deferred version of finally


3.

addCallbacks: decision making based on previous success or failure

根据上一步执行成功或失败做决策


4. deferred是有状态的,或者说deferred本身也是"延迟的"。

一个callback的执行,分两种情况。

第一:完事具备,只欠东风。也就是说所有的callback都已经注册好了,只等d.callback()触发这个callback 链。

第二:东风已来,弓箭还没准备好。等弓箭已经准备好,立即就派上了用场。在调了d.callback()之后,我们依然可以给deferred注册callback.这些callback会立即执行。

deferred会记住当前执行到了哪一步。并时刻等待着执行下一步。

#-*- coding:utf-8 -*-

from twisted.internet import defer

d = defer.Deferred()
d.callback('r')

def back1(r):
    print "back1:" + r
    return "r"+r

def back2(r):
    print "back2:" + r
    return r+'r'

def back3(r):
    print "back3:" + r
    return r + 'r'

import time

d.addCallback(back1)
time.sleep(3)
d.addCallback(back2)
time.sleep(3)
d.addCallback(back3)
print d.result   # deferred 会自己保留最后执行的结果


5.deferred是分形的,或者说是递归的,或者说是可以嵌套的。这使得这个结构非常漂亮。

from twisted.internet import defer
from twisted.python import failure, util


class Counter(object):
    num = 0
    let = 'a'

    def incrLet(cls):
        cls.let = chr(ord(cls.let) + 1)
    incrLet = classmethod(incrLet)


def handleFailure(f):
    print "errback"
    print "we got an exception: %s" % (f.getTraceback(),)
    return f

def subCb_B(result):
    print "sub-callback %s" % (Counter.let,)
    Counter.incrLet()
    s = " beautiful!"
    print "\tadding %r to result" % (s,)
    result += s
    return result

def subCb_A(result):
    print "sub-callback %s" % (Counter.let,)
    Counter.incrLet()
    s = " are "
    print "\tadding %r to result" % (s,)
    result += s
    return result

def mainCb_1(result):
    Counter.num += 1
    print "callback %s" % (Counter.num,)
    print "\tgot result: %s" % (result,)
    result += " Deferreds "

    d = defer.Deferred().addCallback(subCb_A
                       ).addCallback(subCb_B)
    d.callback(result)
    return d

def mainCb_2(result):
    Counter.num += 1
    print "callback %s" % (Counter.num,)
    print "\tgot result: %s" % (result,)


def deferredExample():
    d = defer.Deferred().addCallback(mainCb_1
                       ).addCallback(mainCb_2)

    d.callback("I hope you'll agree: ")


if __name__ == '__main__':
    deferredExample()


你可能感兴趣的:(deferred,twisted)