DeferredList
有时候,你想等全部的事件都发生后通知你,而不是每个都通知一下。好比,你想等待在在一个列表里的全部链接都关闭后通知你,twisted.internet.defer.DeferredList 可以完成你想要的功能。
为了建立一个DeferredList从多个Deferreds,你只须要简单的传递一个列表就能够了: this
#Create a DeferredList
dl = defer.DeferredList([deferred1, deferred2, deferred3]) spa
你能够把这个DeferredList当作一个原生的Deferred;你可以调用 addCallbacks等.DeferredList将调用它的callback当全部的deferreds完成的时候 three
例子 事件
from twisted.internet import defer get
def printResult(result):
for (success, value) in result:
if success:
print 'Success', value
else:
print 'Failure', value.getErrorMessage() it
deferred1 = defer.Deferred()
deferred2 = defer.Deferred()
deferred3 = defer.Deferred() io
dl = defer.DeferredList([deferred1, deferred2, deferred3], consumeErrors=True) import
dl.addCallback(printResult) List
deferred1.callback('one')
deferred2.errback(Exception('bang!!'))
deferred3.callback('three') im
结果:
# Success: on
# Failure: bang!
# Success: three
一个标准的DeferredList 应该历来不要调用errback,可是failures在Deferreds会被传递到DeferredList会任然errorback除非consumeError 被设置为True
def printResult(result):
print result
def addTen(result):
return result + " ten"
# Deferred gets callback before DeferredList is created
deferred1 = defer.Deferred()
deferred2 = defer.Deferred()
deferred1.addCallback(addTen)
dl = defer.DeferredList([deferred1, deferred2])
dl.addCallback(printResult)
deferred1.callback("one") # fires addTen, checks DeferredList, stores "one ten"
deferred2.callback("two")
#[(True, 'one ten'), (True, 'two')]
deferred1 = defer.Deferred()
deferred2 = defer.Deferred()
dl = defer.DeferredList([deferred1, deferred2])
deferred1.addCallback(addTen) # will run*after*DeferredList gets its value
dl.addCallback(printResult)
deferred1.callback("one") # checks DeferredList, stores "one", fires addTen
deferred2.callback("two")
# At this point, dl will fire its callback, printing:
# [(1, ’one), (1, ’two’)]
参数consumeErrors和DeferredList有一样的意义。若是为true,gatherResult会拒绝全部的错误
在Deferreds里的。你应该老是使用这个参数,除非你想更深层的调用,或者你知道他们永远不会出错。
不然会发生一个未知错误,并被twisted记录进log.