1. deffered 延迟链:
将多个回调加入延时链中,第一个回调函数用deffer.callback(a)调用,a是传入的一个参数,必须要有一个参数才能调用第一个回调函数。第二个回调使用第一个回调的结果调用。如果出现异常,将绕过回调链,所以每定一个回调用函数,都要让回调函数接受一个参数。
# 创建回调函数,每个回调函数都要接受至少一个参数
def myfun(a):
input("myinput:") # 会在这里阻塞
print("My fun1 %d" % (a+100))
return 1
def myfun2(b):
print("My fun2 %d" % (b+100))
return 2
d = defer.Deferred() # 创建Deferred对象
d.addCallback(myfun) # 添加第一个回调
d.addCallback(myfun2) # 添加第二个回调,第一个回调的返回结果会传给第二个回调
d.callback(0) # 填一个参数,这个参数会传给第一个回调,以启动第一个回调
回调的结果总是作为第一个参数传递给下一个回调,从而创建一个处理器链。如果回调引发异常,请切换到errback。
2. DeferredList,让所有回调函数都执行结束了再通知
在不同几个事件发生后得到通知,而不是单独等待每一个事件。可以用 twisted.internet.defer.deferredlist创建一个 DefferedList()之后,可以用它的addCallbacks()来添加回调函数。当所有的延迟完成时,DefferedList()会调用其回调函数,回调函数将使用它包含的延迟结果列表。
def printResult(result):
for (success, value) in result:
if success:
print('Success:', value)
else:
print('Failure:', value.getErrorMessage())
def myfun1(a):
input("myinput1:")
print(a)
return a
def myfun2(b):
input("myinput2:")
print(b)
return b
def myfun3(c):
input("myinput3:")
print(c)
return c
# 创建3个延迟
deferred1 = defer.Deferred()
deferred2 = defer.Deferred()
deferred3 = defer.Deferred()
# 为每个延时添加调用
deferred1.addCallback(myfun1)
deferred2.addCallback(myfun2)
deferred3.addCallback(myfun3)
# 把三个延迟打包在一起,成为一个DeferredList对象
dl = defer.DeferredList([deferred1, deferred2, deferred3], consumeErrors=True)
# 添加回调,等所有延迟完成了,会调用这个回调,把延迟的结果传给它
dl.addCallback(printResult)
# Fire our three deferreds with various values.
deferred1.callback('one') # 调用 myfun1() 并把"one"传给它
deferred2.errback(Exception('bang!'))
deferred3.callback('three')
本文参考文章: