Thursday, March 24, 2011

What is the best way to repeatedly execute a function every x seconds in Python?

I want to repeatedly execute a function in Python every 60 seconds forever (just like an NSTimer in Objective C). This code will run as a daemon and is effectively like calling the python script every minute using a cron, but without requiring that to be set up by the user.

In this question about a cron implemented in Python, the solution appears to effectively just sleep() for x seconds. I don't need such advanced functionality so perhaps something like this would work

while True:
    # Code executed here
    time.sleep(60)

Are there any foreseeable problems with this code?

From stackoverflow
  • Use the sched module

    import sched, time
    s = sched.scheduler(time.time, time.sleep)
    def do_something(sc): 
        print "Doing stuff..."
        # do your stuff
        sc.enter(60, 1, do_something, (sc,))
    
    s.enter(60, 1, do_something, (s,))
    s.run()
    
    Baishampayan Ghose : The sched module is for scheduling functions to run after some time, how do you use it to repeat a function call every x seconds without using time.sleep()?
    nosklo : @Baishampayan: Just schedule a new run.
    Alabaster Codify : Kronos, based on sched, offers a higher level interface: http://www.razorvine.net/download/kronos.py Used by TurboGears.
  • The main difference between that and cron is that an exception will kill the daemon for good. You might want to wrap with an exception catcher and logger.

  • You might want to consider Twisted which is a python networking library that implements the Reactor Pattern.

    from twisted.internet import task
    from twisted.internet import reactor
    
    timeout = 60.0 # Sixty seconds
    
    def doWork():
        #do work here
        pass
    
    l = task.LoopingCall(doWork)
    l.start(timeout) # call every sixty seconds
    
    reactor.run()
    

    While "while True: sleep(60)" will probably work Twisted probably already implements many of the features that you will eventually need (daemonization, logging or exception handling as pointed out by bobince) and will probably be a more robust solution

    Baishampayan Ghose : I knew Twisted could do this. Thanks for sharing the example code!

0 comments:

Post a Comment