twisted学习(deferred机制)

僤鯓⒐⒋嵵緔 提交于 2019-11-27 04:25:25

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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!