from twisted.internet import defer, reactor from __future__ import generators def unwrapDeferredGenerator(generator): deferred = generator.next() if deferred is None: return deferred.generator = generator deferred.addCallback(resultCallback, deferred) return deferred def resultCallback(result, deferred): deferred.result = result unwrapDeferredGenerator(deferred.generator) return result def generate(): deferred = defer.Deferred() reactor.callLater(0.5, deferred.callback, "hello") yield deferred # When this function resumes, the result will be ready print deferred.result deferred = defer.Deferred() reactor.callLater(0.5, deferred.callback, "foo") yield deferred print deferred.result deferred = defer.Deferred() reactor.callLater(0.5, deferred.callback, "bar") yield deferred print deferred.result # Yield None to indicate this deferred generator is exhausted yield None unwrapDeferredGenerator(generate()) reactor.run()