twisted学习(三):Deferred

1. Deferred介绍

Deferred的Twisted抽象出来的一对回调链, 一个是处理正确的结果,一个是处理异常的结果。也就是可以向Deferred对象中添加callback和errback。然后可以用正确的或异常的结果来激活Deferred。激活后的Deferred就按照我们添加的顺序激活callback或errback.

twisted学习(三):Deferred

2.Deferred单独使用

from twisted.internet.defer import Deferred

def normal(result):

print 'i am normal'

print result

def failed(err):

print 'failed!'

d = Deferred()

d.addCallbacks(normal,failed)

d.callback('right')

print 'finish'

结果:

i am normal

right

finish

from twisted.internet.defer import Deferred

from twisted.python.failure import Failure

def normal(result):

print 'i am normal'

print result

def failed(err):

print 'failed!'

d = Deferred()

d.addCallbacks(normal, failed)

d.errback(Failure(Exception('i have failed')))

print 'finish'

结果:

failed!

finish

Deferred需要显示创建对象,而没有启用reactor。通过addCallbacks添加callback和errback回调函数。使用callback激活deferred对象。

注意:

1. Deferred需要添加回调函数对,方法有addCallbacks(callback, errback),或addCallback(callback)和addErrback(errback)同时使用,还可以使用addBoth(callback),这里callback即作为正确回调也做为错误回调。

2.callback函数传递正确的结果.errback函数传递错误的结果

3.Failure作为错误的对象,也可以传入Exception对象,自动转化成Failure

4. Deferred只能激活一次

3.reactor使用Deferred

针对一个例子修改如下:

from twisted.internet.defer import

Deferred

from twisted.python.failure import Failure

from twisted.internet import reactor

def normal(result):

print 'i am normal'

print result

def failed(err):

print 'failed!'

def finish(_):

print 'finish'

reactor.stop()

d = Deferred()

d.addCallbacks(normal, failed)

d.addBoth(finish)

reactor.callWhenRunning(d.callback, 'right')

reactor.run()

结果

i am normal

right

这里使用ractor的callWhenRunning激活的deferred对象。而且在deferred对象中添加了两个回调函数对,真正使用了回调函数链。注意finish函数参数使用_,表示参数不会使用,但是还必须有一个参数。

4. 总结

1.Deferred是需要添加回到函数对的,即callback和errback

2.Deferred只能调用一次

3.Deferred激活方式自身调用callback函数,也可以通过reactor调用。


分享到:


相關文章: