twisted学习(deferred机制)

    一、在异步编程中,defer机制主要是用来管理callback函数,在twisted中,许多功能的实现都是采用的事件驱动机制,在异步编程中,错误处理机制和同步程序并不同,异步程序会无视错误执行下去。在异步程序中处理错误显得十分重要。defer就是来能够帮助咱们来管理咱们的callback和errback函数。合理的安排defer在异步编程中显得十分重要。 python

    二、一个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只能被调用一次。 code

相关文章
相关标签/搜索