[Twisted-Python] callLater(0) is A BIG LIE
Phillip J. Eby
pje at telecommunity.com
Mon Nov 1 12:44:12 EST 2004
At 03:41 AM 11/1/04 -0700, Jonathan Simms wrote:
>I'd like to offer some reflections on the reactor and facilitate some
>conversation on a subject that's been causing me much frustration:
> the twisted idiom, "callLater(0)"
>While it seems that this is a DelayedCall, it really is a lie. It has
>nothing to do with time at all, it is a very *convenient* lie that we
>all have accepted, but is a lie nonetheless.
>We all know this means "call function f in the next reactor iteration",
No, it means, "call f *at least* 0 seconds from now", just as
'callLater(1,f)' means "call f *at least* 1 second from now".
AFAIK, iterations have nothing to do with it. In fact, I believe that on a
machine that is sufficiently fast relative to the precision of its 'time()'
function, it was possible for a 'callLater(0,f)' to be invoked in the same
iteration, in some versions of Twisted.
That being said, I think your example points out code in Twisted that's
relying on 'callLater(0,f)' meaning "call f in the next iteration", and
that code should probably be considered broken. Only a non-zero value
should guarantee that the code will not run in the current iteration.
(Disclaimer: I'm not a Twisted developer, but I've developed PEAK's
scheduler system to interoperate with Twisted and vice versa, so I've had
occasion to dabble in timer precision and iteration issues.)
More information about the Twisted-Python