How to launch a function at regular time intervals ?
davea at ieee.org
Thu Aug 13 17:52:45 CEST 2009
Grant Edwards wrote:
> On 2009-08-13, Dave Angel <davea at ieee.org> wrote:
>> I'm assuming you want to call it every time_interval seconds, on
>> average, with a little jitter allowed on each call, but keeping correct
>> long term. In other words, if one call is a little late, you want the
>> next one to still happen as close to on-time as possible.
>> The general outline is something like (untested):
>> times_called = 0 #number of times function has been called
>> start_time = now
>> while True:
>> elapsed = now - start_time
>> int_elapsed = int(elapsed/time_interval)
>> for times_called in range(times_called, int_elapsed):
>> sleep(time_interval/10) #this might give us 10% jitter, which is usually fine
> I don't understand the reasoning behind the above loop --
> specifically the sleeping of smaller intervals than needed.
> Why not something like this:
> interval = 5.0 # interval in seconds
> next = time.time()
> while True:
> now = time.time()
> if now < next:
> print "call_the_function()"
> next += interval
> That will be accurate over the long term with minimal jitter.
Two reasons I didn't take an approach like that one.
1) I frequently need to do something else while waiting, so I tend to do
multiple smaller sleeps. As long as each sleep is at least 100ms, the
overhead cost is pretty small.
2) If (occasionally) the function takes longer than the specified
interval time, my approach does catch-up calls so the average remains
My loop was only a rough outline, and if neither of these considerations
applies, yours is much nicer.
More information about the Python-list