[Twisted-Python] Timeout for Deferred objects

Jean-Paul Calderone exarkun at divmod.com
Sat Dec 8 11:25:40 EST 2007


On Sat, 8 Dec 2007 11:52:00 +0200, Mustafa Sakalsiz <sakalsiz at gmail.com> wrote:
>Hi,
>
>I want set a timeout for Deferred objects. There is a method in
>Deferred class, setTimeout. It works well for me, but it gives a
>deprecation warning. If setTimeout is deprecated, what else I should
>use for timeouts.

It's deprecated because having a timeout for a Deferred doesn't make sense.
A Deferred is just a convenient API for associating a result with the code
which is interested in the result.  It doesn't ever produce the result itself,
so it isn't the right object to give a timeout to.

Instead, the code which is responsible for calling back the Deferred is the
code which needs to be given a timeout.  There's no general way to do this,
since the code for calling back Deferreds is different for each Deferred.
Some APIs support timeouts already - for example, reactor.resolve - but
not all of them do.

You can add a timeout to an API which doesn't support timeouts in one of
two ways:

  - Add it and implement whatever changes are necessary so that after the
    timeout the underlying operation is cancelled.  You may want to submit
    patches. :)

  - Wrap the original API with one which supports a timeout.  This will
    return a Deferred it creates and call it back when the underlying
    Deferred is called back - unless the timeout has expired, then it will
    just drop the result.

In either case, you'll probably use reactor.callLater to implement the
timeout.

Jean-Paul




More information about the Twisted-Python mailing list