Schedule a repeating event in Python 3

python, python-3.x, scheduled-tasks, timing

Solution

You could use `threading.Timer`, but that also schedules a one-off event, similarly to the `.enter` method of scheduler objects.

The normal pattern (in any language) to transform a one-off scheduler into a periodic scheduler is to have each event re-schedule itself at the specified interval. For example, with `sched`, I would not use a loop like you're doing, but rather something like:

def periodic(scheduler, interval, action, actionargs=()):
    scheduler.enter(interval, 1, periodic,
                    (scheduler, interval, action, actionargs))
    action(*actionargs)

and initiate the whole "forever periodic schedule" with a call

periodic(scheduler, 3600, query_rate_limit)

Or, I could use `threading.Timer` instead of `scheduler.enter`, but the pattern's quite similar.

If you need a more refined variation (e.g., stop the periodic rescheduling at a given time or upon certain conditions), that's not too hard to accomodate with a few extra parameters.

Problem

I'm trying to schedule a repeating event to run every minute in Python 3. I've seen class `sched.scheduler` but I'm wondering if there's another way to do it. I've heard mentions I could use multiple threads for this, which I wouldn't mind doing. I'm basically requesting some JSON and then parsing it; its value changes over time. To use `sched.scheduler` I have to create a loop to request it to schedule the even to run for one hour: ``` scheduler = sched.scheduler(time.time, time.sleep) # Schedule the event. THIS IS UGLY! for i in range(60): scheduler.enter(3600 * i, 1, query_rate_limit, ()) scheduler.run() ``` What other ways to do this are there?

Original source

Related problems