1. Deferred介绍
Deferred的Twisted抽象出来的一对回调链, 一个是处理正确的结果,一个是处理异常的结果。也就是可以向Deferred对象中添加callback和errback。然后可以用正确的或异常的结果来激活Deferred。激活后的Deferred就按照我们添加的顺序激活callback或errback.
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调用。
閱讀更多 用數說話 的文章