Grant Edwards wrote:
On 2009-08-13, Dave Angel <da...@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):
                    call_the_function()
     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: time.sleep(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 the same.

My loop was only a rough outline, and if neither of these considerations applies, yours is much nicer.

DaveA
--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to