class documentation

class twisted.internet.defer.Deferred: (source)

Known subclasses: twisted.internet.defer.DeferredList, twisted.persisted.crefutil._Defer

View In Hierarchy

This is a callback which will be put off until later.

Why do we want this? Well, in cases where a function in a threaded program would block until it gets a result, for Twisted it should not block. Instead, it should return a Deferred.

This can be implemented for protocols that run over the network by writing an asynchronous protocol for twisted.internet. For methods that come from outside packages that are not under our control, we use threads (see for example twisted.enterprise.adbapi).

For more information about Deferreds, see doc/core/howto/defer.html or http://twistedmatrix.com/documents/current/core/howto/defer.html

When creating a Deferred, you may provide a canceller function, which will be called by d.cancel() to let you do any clean-up necessary if the user decides not to wait for the deferred to complete.

Instance Variable called A flag which is False until either callback or errback is called and afterwards always True.
Instance Variable paused A counter of how many unmatched pause calls have been made on this instance.
Class Variable debug Undocumented
Method __init__ Initialize a Deferred.
Instance Variable callbacks Undocumented
Method addCallbacks Add a pair of callbacks (success and error) to this Deferred.
Method addCallback Convenience method for adding just a callback.
Method addErrback Convenience method for adding just an errback.
Method addBoth Convenience method for adding a single callable as both a callback and an errback.
Method addTimeout Time out this Deferred by scheduling it to be cancelled after timeout seconds.
Method chainDeferred Chain another Deferred to this Deferred.
Method callback Run all success callbacks that have been added to this Deferred.
Method errback Run all error callbacks that have been added to this Deferred.
Method pause Stop processing on a Deferred until unpause() is called.
Method unpause Process all callbacks made since pause() was called.
Method cancel Cancel this Deferred.
Instance Variable result Undocumented
Method __str__ Return a string representation of this Deferred.
Method __iter__ Undocumented
Method send Undocumented
Method asFuture Adapt this Deferred into a asyncio.Future which is bound to loop.
Class Method fromFuture Adapt an asyncio.Future to a Deferred.
Class Method fromCoroutine Schedule the execution of a coroutine that awaits on Deferreds, wrapping it in a Deferred that will fire on success/failure of the coroutine.
Instance Variable _suppressAlreadyCalled A flag used by the cancellation mechanism which is True if the Deferred has no canceller and has been cancelled, False otherwise. If True, it can be expected that callback or errback will eventually be called and the result should be silently discarded.
Instance Variable _runningCallbacks A flag which is True while this instance is executing its callback chain, used to stop recursive execution of _runCallbacks
Instance Variable _chainedTo If this Deferred is waiting for the result of another Deferred, this is a reference to the other Deferred. Otherwise, None.
Instance Variable _debugInfo Undocumented
Instance Variable _canceller Undocumented
Method _startRunCallbacks Undocumented
Method _continuation Build a tuple of callback and errback with _CONTINUE.
Method _runCallbacks Run the chain of callbacks once a result is available.
called = (source)
A flag which is False until either callback or errback is called and afterwards always True.
(type: bool)
paused = (source)
A counter of how many unmatched pause calls have been made on this instance.
(type: int)
_suppressAlreadyCalled = (source)
A flag used by the cancellation mechanism which is True if the Deferred has no canceller and has been cancelled, False otherwise. If True, it can be expected that callback or errback will eventually be called and the result should be silently discarded.
(type: bool)
_runningCallbacks = (source)
A flag which is True while this instance is executing its callback chain, used to stop recursive execution of _runCallbacks
(type: bool)
_chainedTo = (source)
If this Deferred is waiting for the result of another Deferred, this is a reference to the other Deferred. Otherwise, None.
(type: Optional[Deferred])
_debugInfo = (source)

Undocumented

debug = (source)

Undocumented

(type: bool)
def __init__(self, canceller=None): (source)

Initialize a Deferred.

Parameterscancellera callable used to stop the pending operation scheduled by this Deferred when Deferred.cancel is invoked. The canceller will be passed the deferred whose cancelation is requested (i.e., self).

If a canceller is not given, or does not invoke its argument's callback or errback method, Deferred.cancel will invoke Deferred.errback with a CancelledError.

Note that if a canceller is not given, callback or errback may still be invoked exactly once, even though defer.py will have already invoked errback, as described above. This allows clients of code which returns a Deferred to cancel it without requiring the Deferred instantiator to provide any specific implementation support for cancellation. New in 10.1.

(type: a 1-argument callable which takes a Deferred. The return result is ignored.)
callbacks = (source)

Undocumented

(type: list)
_canceller = (source)

Undocumented

def addCallbacks(self, callback, errback=None, callbackArgs=None, callbackKeywords=None, errbackArgs=None, errbackKeywords=None): (source)

Add a pair of callbacks (success and error) to this Deferred.

These will be executed when the 'master' callback is run.

Returnsself. (type: a Deferred)
def addCallback(self, callback, *args, **kw): (source)

Convenience method for adding just a callback.

See addCallbacks.

def addErrback(self, errback, *args, **kw): (source)

Convenience method for adding just an errback.

See addCallbacks.

def addBoth(self, callback, *args, **kw): (source)

Convenience method for adding a single callable as both a callback and an errback.

See addCallbacks.

def addTimeout(self, timeout, clock, onTimeoutCancel=None): (source)

Time out this Deferred by scheduling it to be cancelled after timeout seconds.

The timeout encompasses all the callbacks and errbacks added to this defer.Deferred before the call to addTimeout, and none added after the call.

If this Deferred gets timed out, it errbacks with a TimeoutError, unless a cancelable function was passed to its initialization or unless a different onTimeoutCancel callable is provided.

Parameterstimeoutnumber of seconds to wait before timing out this Deferred (type: int)
clockThe object which will be used to schedule the timeout. (type: twisted.internet.interfaces.IReactorTime)
onTimeoutCancelA callable which is called immediately after this Deferred times out, and not if this Deferred is otherwise cancelled before the timeout. It takes an arbitrary value, which is the value of this Deferred at that exact point in time (probably a CancelledError Failure), and the timeout. The default callable (if none is provided) will translate a CancelledError Failure into a TimeoutError. (type: callable)
Returnsself. (type: a Deferred)
Present Since16.5
def chainDeferred(self, d): (source)

Chain another Deferred to this Deferred.

This method adds callbacks to this Deferred to call d's callback or errback, as appropriate. It is merely a shorthand way of performing the following:

    self.addCallbacks(d.callback, d.errback)

When you chain a deferred d2 to another deferred d1 with d1.chainDeferred(d2), you are making d2 participate in the callback chain of d1. Thus any event that fires d1 will also fire d2. However, the converse is not true; if d2 is fired d1 will not be affected.

Note that unlike the case where chaining is caused by a Deferred being returned from a callback, it is possible to cause the call stack size limit to be exceeded by chaining many Deferreds together with chainDeferred.

Returnsself. (type: a Deferred)
def callback(self, result): (source)

Run all success callbacks that have been added to this Deferred.

Each callback will have its result passed as the first argument to the next; this way, the callbacks act as a 'processing chain'. If the success-callback returns a Failure or raises an Exception, processing will continue on the *error* callback chain. If a callback (or errback) returns another Deferred, this Deferred will be chained to it (and further callbacks will not run until that Deferred has a result).

An instance of Deferred may only have either callback or errback called on it, and only once.

ParametersresultThe object which will be passed to the first callback added to this Deferred (via addCallback).
RaisesAlreadyCalledErrorIf callback or errback has already been called on this Deferred.
def errback(self, fail=None): (source)

Run all error callbacks that have been added to this Deferred.

Each callback will have its result passed as the first argument to the next; this way, the callbacks act as a 'processing chain'. Also, if the error-callback returns a non-Failure or doesn't raise an Exception, processing will continue on the *success*-callback chain.

If the argument that's passed to me is not a failure.Failure instance, it will be embedded in one. If no argument is passed, a failure.Failure instance will be created based on the current traceback stack.

Passing a string as `fail' is deprecated, and will be punished with a warning message.

An instance of Deferred may only have either callback or errback called on it, and only once.

ParametersfailThe Failure object which will be passed to the first errback added to this Deferred (via addErrback). Alternatively, a Exception instance from which a Failure will be constructed (with no traceback) or None to create a Failure instance from the current exception state (with a traceback).
RaisesAlreadyCalledErrorIf callback or errback has already been called on this Deferred.
NoCurrentExceptionErrorIf fail is None but there is no current exception state.
def pause(self): (source)

Stop processing on a Deferred until unpause() is called.

def unpause(self): (source)

Process all callbacks made since pause() was called.

def cancel(self): (source)

Cancel this Deferred.

If the Deferred has not yet had its errback or callback method invoked, call the canceller function provided to the constructor. If that function does not invoke callback or errback, or if no canceller function was provided, errback with CancelledError.

If this Deferred is waiting on another Deferred, forward the cancellation to the other Deferred.

def _startRunCallbacks(self, result): (source)

Undocumented

result = (source)

Undocumented

def _continuation(self): (source)

Build a tuple of callback and errback with _CONTINUE.

def _runCallbacks(self): (source)

Run the chain of callbacks once a result is available.

This consists of a simple loop over all of the callbacks, calling each with the current result and making the current result equal to the return value (or raised exception) of that call.

If _runningCallbacks is true, this loop won't run at all, since it is already running above us on the call stack. If self.paused is true, the loop also won't run, because that's what it means to be paused.

The loop will terminate before processing all of the callbacks if a Deferred without a result is encountered.

If a Deferred with a result is encountered, that result is taken and the loop proceeds.

NoteThe implementation is complicated slightly by the fact that chaining (associating two Deferreds with each other such that one will wait for the result of the other, as happens when a Deferred is returned from a callback on another Deferred) is supported iteratively rather than recursively, to avoid running out of stack frames when processing long chains.
def __str__(self): (source)

Return a string representation of this Deferred.

ReturnsUndocumented (type: str)
def __iter__(self): (source)

Undocumented

@failure._extraneous
def send(self, value=None): (source)

Undocumented

def asFuture(self, loop): (source)

Adapt this Deferred into a asyncio.Future which is bound to loop.

ParametersloopThe asyncio event loop to bind the asyncio.Future to. (type: asyncio.AbstractEventLoop or similar)
ReturnsA Future which will fire when the Deferred fires. (type: asyncio.Future)
Present SinceTwisted 17.5.0
Noteconverting a Deferred to an asyncio.Future consumes both its result and its errors, so this method implicitly converts self into a Deferred firing with None, regardless of what its result previously would have been.
@classmethod
def fromFuture(cls, future): (source)

Adapt an asyncio.Future to a Deferred.

ParametersfutureThe Future to adapt. (type: asyncio.Future)
ReturnsA Deferred which will fire when the Future fires. (type: Deferred)
Present SinceTwisted 17.5.0
NoteThis creates a Deferred from a asyncio.Future, not from a coroutine; in other words, you will need to call asyncio.ensure_future, asyncio.loop.create_task or create an asyncio.Task yourself to get from a coroutine to a asyncio.Future if what you have is an awaitable coroutine and not a asyncio.Future. (The length of this list of techniques is exactly why we have left it to the caller!)
@classmethod
def fromCoroutine(cls, coro): (source)

Schedule the execution of a coroutine that awaits on Deferreds, wrapping it in a Deferred that will fire on success/failure of the coroutine.

Coroutine functions return a coroutine object, similar to how generators work. This function turns that coroutine into a Deferred, meaning that it can be used in regular Twisted code. For example:

    import treq
    from twisted.internet.defer import Deferred
    from twisted.internet.task import react

    async def crawl(pages):
        results = {}
        for page in pages:
            results[page] = await treq.content(await treq.get(page))
        return results

    def main(reactor):
        pages = [
            "http://localhost:8080"
        ]
        d = Deferred.fromCoroutine(crawl(pages))
        d.addCallback(print)
        return d

    react(main)
ParameterscoroThe coroutine object to schedule. (type: A Python 3.5+ async def coroutine or a Python 3.4+ yield from coroutine.)
ReturnsUndocumented (type: Deferred)
RaisesValueErrorIf coro is not a coroutine or generator.
Present SinceTwisted 21.2.0
API Documentation for Twisted, generated by pydoctor 20.12.1 at 2021-02-28 19:53:36.