[Twisted-Python] Timeouts for Deferreds?
Andrew Bennetts
andrew-twisted at puzzling.org
Thu May 2 21:00:11 MDT 2002
I just thought of another feature I would find handy in Deferreds,
although perhaps this feature belongs somewhere else...
Deferred.timeout(secs):
If I am uncalled for secs seconds after being armed, call my errback
automatically.
This way callers can control how long they will wait for a Deferred to
do something. Methods returns Deferreds could also set a reasonable
default with .timeout that the caller can override by calling .timeout
again. A timeout of None would, of course, mean never timeout.
I can see this as being useful in many ways. The biggest problem with
it is I'm not sure what should happen when you try to call a Deferred
after it has timed out (e.g. your CGI script took 5 minutes, timed out
and thus called errback, but did eventually finish). I don't think
calling callback/errback should raise an AlreadyCalledException, because
the timeout may have been set by a client of a library that doesn't
expect timeouts. On the other hand, I don't like the idea of things
failing silently. The ideal situation is, of course, to make sure that
the timeout event always cancels whatever it is that would later call
callback/errback, but I don't like making it a requirement that this
must happen (plus it probably means adding a "timeback" method, or
something).
Perhaps a TimeoutDeferred subclass? But then it's not generally useful
anymore, unless a method explicitly returns TimeoutDeferred and not
Deferred. Still, encouraging people to use hard-coded arbitrary
timeouts everywhere probably isn't a good idea either.
Thoughts, anyone?
(Actual implementation details left as an exercise for the reader...
actually, I'm happy to do it if people want this).
-Andrew.
More information about the Twisted-Python
mailing list