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

后端 未结 18 2690
不知归路
不知归路 2020-11-21 06:04

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 call

18条回答
  •  轻奢々
    轻奢々 (楼主)
    2020-11-21 06:24

    If you want a non-blocking way to execute your function periodically, instead of a blocking infinite loop I'd use a threaded timer. This way your code can keep running and perform other tasks and still have your function called every n seconds. I use this technique a lot for printing progress info on long, CPU/Disk/Network intensive tasks.

    Here's the code I've posted in a similar question, with start() and stop() control:

    from threading import Timer
    
    class RepeatedTimer(object):
        def __init__(self, interval, function, *args, **kwargs):
            self._timer     = None
            self.interval   = interval
            self.function   = function
            self.args       = args
            self.kwargs     = kwargs
            self.is_running = False
            self.start()
    
        def _run(self):
            self.is_running = False
            self.start()
            self.function(*self.args, **self.kwargs)
    
        def start(self):
            if not self.is_running:
                self._timer = Timer(self.interval, self._run)
                self._timer.start()
                self.is_running = True
    
        def stop(self):
            self._timer.cancel()
            self.is_running = False
    

    Usage:

    from time import sleep
    
    def hello(name):
        print "Hello %s!" % name
    
    print "starting..."
    rt = RepeatedTimer(1, hello, "World") # it auto-starts, no need of rt.start()
    try:
        sleep(5) # your long-running job goes here...
    finally:
        rt.stop() # better in a try/finally block to make sure the program ends!
    

    Features:

    • Standard library only, no external dependencies
    • start() and stop() are safe to call multiple times even if the timer has already started/stopped
    • function to be called can have positional and named arguments
    • You can change interval anytime, it will be effective after next run. Same for args, kwargs and even function!

提交回复
热议问题