1、在异步编程中,defer机制主要是用来管理callback函数,在twisted中,许多功能的实现都是采用的事件驱动机制,在异步编程中,错误处理机制和同步程序并不一样,异步程序会无视错误执行下去。在异步程序中处理错误显得十分重要。defer就是来可以帮助我们来管理我们的callback和errback函数。合理的安排defer在异步编程中显得十分重要。
2、一个deferred包含有一对callback链,一个用于处理正常的情况,一个用于处理异常情况。每一对链都是一个互斥关系,也就是说,当callback执行了,那么errback就不会执行了。同样,errback执行了,那么callback不会执行
from twisted.internet.defer import Deferred
def successHandle(result):
print 'It is success:'
print result
def failedHandle(reason):
print 'Error.'
d = Deferred()
# add a callback/errback pair to the chain
d.addCallbacks(successHandle, failedHandle)
# fire the chain with a normal result
d.callback('Successful')
print "Finished"
输出的结果如下
It is success: Successful Finished
可以看到,这里使用defer成功的调用了successHandle()函数来处理正常的情况。如果想处理错误的情况,将d.callback('Successful')修改成errback('Error'),errback的参数是一个Failure类型。所以,错误处理如下:
from twisted.internet.defer import Deferred
from twisted.python.failure import Failure
def successHandle(result):
print 'It is success:'
print result
def failedHandle(reason):
print 'Error.'
d = Deferred()
# add a callback/errback pair to the chain
d.addCallbacks(successHandle, failedHandle)
# fire the chain with a normal result
d.errback(Failure(Exception('It is Error!')))
print "Finished"
我们可以使用deferreds来搞定普通的Exceptions,Failusers可以帮我们自动处理,我们不用去考虑,而且deferred将保证每次errback是随着Failure实例调用的。看下面的代码:
from twisted.internet.defer import Deferred
def out(s): print s
d = Deferred()
d.addCallbacks(out, out)
d.callback('First result')
d.callback('Second result')
print 'Finished'
你会发现只会打印一个,第二次则不会打印出来,也就是说,同一个callback只能被调用一次。
来源:oschina
链接:https://my.oschina.net/u/778466/blog/160698