与setInterval()相当的Python?

与setInterval()相当的Python?,python,setinterval,Python,Setinterval,Python是否具有类似于JavaScript的setInterval()的功能 谢谢,sched模块为一般Python代码提供了这些功能。但是,正如其文档所示,如果您的代码是多线程的,那么使用threading.Timer类可能更有意义。Python中的工作方式不同:您需要sleep()(如果要阻止当前线程)或启动新线程。请参见以下内容: 我想这就是你想要的: #timertest.py import sched, time def dostuff(): print "stuff is b

Python是否具有类似于JavaScript的
setInterval()
的功能


谢谢,
sched
模块为一般Python代码提供了这些功能。但是,正如其文档所示,如果您的代码是多线程的,那么使用
threading.Timer
类可能更有意义。

Python中的工作方式不同:您需要
sleep()
(如果要阻止当前线程)或启动新线程。请参见以下内容:


我想这就是你想要的:

#timertest.py
import sched, time
def dostuff():
  print "stuff is being done!"
  s.enter(3, 1, dostuff, ())

s = sched.scheduler(time.time, time.sleep)
s.enter(3, 1, dostuff, ())
s.run()

如果在repeating方法的末尾向调度程序添加另一个条目,它将继续运行。

这可能就是您要查找的正确代码段:

import threading

def set_interval(func, sec):
    def func_wrapper():
        set_interval(func, sec)
        func()
    t = threading.Timer(sec, func_wrapper)
    t.start()
    return t

稍微改变一下Nailxx的答案,你就得到了答案

from threading import Timer

def hello():
    print "hello, world"
    Timer(30.0, hello).start()

Timer(30.0, hello).start() # after 30 seconds, "hello, world" will be printed

最近,我和你有同样的问题。我发现这些解:

一,。你可以使用图书馆:(上面有介绍)

二,。你可以使用图书馆:(上面也有介绍)


3。您可以使用该库:(推荐)

只要保持它的简洁即可

import threading

def setInterval(func,time):
    e = threading.Event()
    while not e.wait(time):
        func()

def foo():
    print "hello"

# using
setInterval(foo,5)

# output:
hello
hello
.
.
.
编辑:此代码是非阻塞的

import threading

class ThreadJob(threading.Thread):
    def __init__(self,callback,event,interval):
        '''runs the callback function after interval seconds

        :param callback:  callback function to invoke
        :param event: external event for controlling the update operation
        :param interval: time in seconds after which are required to fire the callback
        :type callback: function
        :type interval: int
        '''
        self.callback = callback
        self.event = event
        self.interval = interval
        super(ThreadJob,self).__init__()

    def run(self):
        while not self.event.wait(self.interval):
            self.callback()



event = threading.Event()

def foo():
    print "hello"

k = ThreadJob(foo,event,2)
k.start()

print "It is non-blocking"

上面的方法对我来说不太合适,因为我需要能够取消间隔。我将函数转换为一个类,并得出以下结论:

class setInterval():
    def __init__(self, func, sec):
        def func_wrapper():
            self.t = threading.Timer(sec, func_wrapper)
            self.t.start()
            func()
        self.t = threading.Timer(sec, func_wrapper)
        self.t.start()

    def cancel(self):
        self.t.cancel()

上面的一些答案使用了
func_wrapper
threading.Timer
确实有效,只是每次调用间隔时它都会产生一个新线程,这会导致内存问题

下面的基本示例大致实现了类似的机制,将interval放在一个单独的线程上。它在给定的时间间隔睡觉。在开始编写代码之前,您需要注意以下一些限制:

  • JavaScript是单线程的,因此当启动
    setInterval
    中的函数时,其他函数将无法同时工作(不包括工作线程,但让我们讨论一下
    setInterval
    的一般用例。因此,线程是安全的。但是在这个实现中,除非使用
    threading.rLock
    ,否则可能会遇到争用条件

  • 下面的实现使用
    time.sleep
    来模拟时间间隔,但是加上
    func
    的执行时间,这个时间间隔的总时间可能比您预期的要长。因此,根据使用情况,您可能希望“睡眠少”(减去调用
    func
    所花费的时间)

  • 我只是粗略地测试了一下,你绝对不应该像我那样使用全局变量,请随意调整它,使它适合你的系统


  • 说够了,下面是代码:

    # Python 2.7
    import threading
    import time
    
    
    class Interval(object):
        def __init__(self):
            self.daemon_alive = True
            self.thread = None # keep a reference to the thread so that we can "join"
    
        def ticktock(self, interval, func):
            while self.daemon_alive:
                time.sleep(interval)
                func()
    
    num = 0
    def print_num():
        global num
        num += 1
        print 'num + 1 = ', num
    
    def print_negative_num():
        global num
        print '-num = ', num * -1
    
    intervals = {} # keep track of intervals
    g_id_counter = 0 # roughly generate ids for intervals
    
    def set_interval(interval, func):
        global g_id_counter
    
        interval_obj = Interval()
        # Put this interval on a new thread
        t = threading.Thread(target=interval_obj.ticktock, args=(interval, func))
        t.setDaemon(True)
        interval_obj.thread = t
        t.start()
    
        # Register this interval so that we can clear it later
        # using roughly generated id
        interval_id = g_id_counter
        g_id_counter += 1
        intervals[interval_id] = interval_obj
    
        # return interval id like it does in JavaScript
        return interval_id
    
    def clear_interval(interval_id):
        # terminate this interval's while loop
        intervals[interval_id].daemon_alive = False
        # kill the thread
        intervals[interval_id].thread.join()
        # pop out the interval from registry for reusing
        intervals.pop(interval_id)
    
    if __name__ == '__main__':
        num_interval = set_interval(1, print_num)
        neg_interval = set_interval(3, print_negative_num)
    
        time.sleep(10) # Sleep 10 seconds on main thread to let interval run
        clear_interval(num_interval)
        clear_interval(neg_interval)
        print "- Are intervals all cleared?"
        time.sleep(3) # check if both intervals are stopped (not printing)
        print "- Yup, time to get beers"
    
    预期产出:

    num + 1 =  1
    num + 1 =  2
    -num =  -2
     num + 1 =  3
    num + 1 =  4
    num + 1 =  5
    -num =  -5
    num + 1 =  6
    num + 1 =  7
    num + 1 =  8
    -num =  -8
    num + 1 =  9
    num + 1 =  10
    -num =  -10
    Are intervals all cleared?
    Yup, time to get beers
    

    我的Python3模块
    jsinterval.py
    将很有帮助!如下所示:

    """
    Threaded intervals and timeouts from JavaScript
    """
    
    import threading, sys
    
    __all__ =  ['TIMEOUTS', 'INTERVALS', 'setInterval', 'clearInterval', 'setTimeout', 'clearTimeout']
    
    TIMEOUTS  = {}
    INTERVALS = {}
    
    last_timeout_id  = 0
    last_interval_id = 0
    
    class Timeout:
        """Class for all timeouts."""
        def __init__(self, func, timeout):
            global last_timeout_id
            last_timeout_id += 1
            self.timeout_id = last_timeout_id
            TIMEOUTS[str(self.timeout_id)] = self
            self.func = func
            self.timeout = timeout
            self.threadname = 'Timeout #%s' %self.timeout_id
    
        def run(self):
            func = self.func
            delx = self.__del__
            def func_wrapper():
                func()
                delx()
            self.t = threading.Timer(self.timeout/1000, func_wrapper)
            self.t.name = self.threadname
            self.t.start()
    
        def __repr__(self):
            return '<JS Timeout set for %s seconds, launching function %s on timeout reached>' %(self.timeout, repr(self.func))
    
        def __del__(self):
            self.t.cancel()
    
    class Interval:
        """Class for all intervals."""
        def __init__(self, func, interval):
            global last_interval_id
            self.interval_id = last_interval_id
            INTERVALS[str(self.interval_id)] = self
            last_interval_id += 1
            self.func = func
            self.interval = interval
            self.threadname = 'Interval #%s' %self.interval_id
    
        def run(self):
            func = self.func
            interval = self.interval
            def func_wrapper():
                timeout = Timeout(func_wrapper, interval)
                self.timeout = timeout
                timeout.run()
                func()
            self.t = threading.Timer(self.interval/1000, func_wrapper)
            self.t.name = self.threadname
            self.t.run()
    
        def __repr__(self):
            return '<JS Interval, repeating function %s with interval %s>' %(repr(self.func), self.interval)
    
        def __del__(self):
            self.timeout.__del__()
    
    def setInterval(func, interval):
        """
        Create a JS Interval: func is the function to repeat, interval is the interval (in ms)
        of executing the function.
        """
        temp = Interval(func, interval)
        temp.run()
        idx = int(temp.interval_id)
        del temp
        return idx
    
    
    def clearInterval(interval_id):
        try:
            INTERVALS[str(interval_id)].__del__()
            del INTERVALS[str(interval_id)]
        except KeyError:
            sys.stderr.write('No such interval "Interval #%s"\n' %interval_id)
    
    def setTimeout(func, timeout):
        """
        Create a JS Timeout: func is the function to timeout, timeout is the timeout (in ms)
        of executing the function.
        """
        temp = Timeout(func, timeout)
        temp.run()
        idx = int(temp.timeout_id)
        del temp
        return idx
    
    
    def clearTimeout(timeout_id):
        try:
            TIMEOUTS[str(timeout_id)].__del__()
            del TIMEOUTS[str(timeout_id)]
        except KeyError:
            sys.stderr.write('No such timeout "Timeout #%s"\n' %timeout_id)
    
    “”“
    JavaScript中的线程间隔和超时
    """
    导入线程,sys
    __all_uu=['Timeout'、'Interval'、'setInterval'、'clearInterval'、'setTimeout'、'clearTimeout']
    超时={}
    间隔={}
    上次\u超时\u id=0
    最后\u间隔\u id=0
    类超时:
    “”“所有超时的课程。”“”
    定义初始化(self、func、timeout):
    全局最后\u超时\u id
    上次\u超时\u id+=1
    self.timeout\u id=上次超时\u id
    超时[str(self.timeout\u id)]=self
    self.func=func
    self.timeout=超时
    self.threadname='Timeout#%s'%self.Timeout\u id
    def运行(自):
    func=self.func
    delx=自我__
    def func_包装器():
    func()
    delx()
    self.t=threading.Timer(self.timeout/1000,func_包装器)
    self.t.name=self.threadname
    self.t.start()
    定义报告(自我):
    返回“”%(self.timeout,repr(self.func))
    定义(自我):
    self.t.cancel()
    上课时间:
    “”“为所有时间间隔初始化。”“”
    定义初始值(self、func、interval):
    全局最后\u间隔\u id
    self.interval\u id=最后一个\u interval\u id
    间隔[str(self.interval\u id)]=self
    上一次间隔\u id+=1
    self.func=func
    self.interval=间隔
    self.threadname='Interval#%s'%self.Interval\u id
    def运行(自):
    func=self.func
    间隔=自我间隔
    def func_包装器():
    超时=超时(函数包装,间隔)
    self.timeout=超时
    超时。运行()
    func()
    self.t=threading.Timer(self.interval/1000,func_包装器)
    self.t.name=self.threadname
    self.t.run()
    定义报告(自我):
    返回“”%(repr(self.func),self.interval)
    定义(自我):
    self.timeout.\uuu del\uuu()
    def设置间隔(func,间隔):
    """
    创建JS间隔:func是要重复的函数,Interval是间隔(毫秒)
    执行函数的方法。
    """
    温度=间隔(函数,间隔)
    临时运行()
    idx=int(温度间隔\u id)
    德尔坦普
    返回idx
    def清除间隔(间隔\u id):
    尝试:
    区间[str(区间id)]。uu del_uuu()
    del间隔[str(间隔\u id)]
    除KeyError外:
    sys.stderr.write('没有这样的间隔“间隔#%s”\n'%interval\u id)
    def setTimeout(函数,超时):
    """
    创建JS超时:func是超时的函数,Timeout是超时(毫秒)
    执行函数的方法。
    """
    温度=超时(函数,超时)
    临时运行()
    idx=int(临时超时\u id)
    德尔坦普
    返回idx
    def clearTimeout(超时\u id):
    尝试:
    超时[str(timeout\u id)]。\uu del\uuu()
    del超时[str(超时\u id)]
    除KeyError外:
    sys.stderr.write('没有这样的超时“timeout#%s”\n'%timeout\u id)
    

    代码编辑: 修复了内存泄漏(由@benjaminz发现)。现在所有线程都被彻底清理。为什么会发生此泄漏?它的发生是因为隐式(甚至显式)引用。在我的例子中,
    超时
    INTERV
    
    """
    Threaded intervals and timeouts from JavaScript
    """
    
    import threading, sys
    
    __all__ =  ['TIMEOUTS', 'INTERVALS', 'setInterval', 'clearInterval', 'setTimeout', 'clearTimeout']
    
    TIMEOUTS  = {}
    INTERVALS = {}
    
    last_timeout_id  = 0
    last_interval_id = 0
    
    class Timeout:
        """Class for all timeouts."""
        def __init__(self, func, timeout):
            global last_timeout_id
            last_timeout_id += 1
            self.timeout_id = last_timeout_id
            TIMEOUTS[str(self.timeout_id)] = self
            self.func = func
            self.timeout = timeout
            self.threadname = 'Timeout #%s' %self.timeout_id
    
        def run(self):
            func = self.func
            delx = self.__del__
            def func_wrapper():
                func()
                delx()
            self.t = threading.Timer(self.timeout/1000, func_wrapper)
            self.t.name = self.threadname
            self.t.start()
    
        def __repr__(self):
            return '<JS Timeout set for %s seconds, launching function %s on timeout reached>' %(self.timeout, repr(self.func))
    
        def __del__(self):
            self.t.cancel()
    
    class Interval:
        """Class for all intervals."""
        def __init__(self, func, interval):
            global last_interval_id
            self.interval_id = last_interval_id
            INTERVALS[str(self.interval_id)] = self
            last_interval_id += 1
            self.func = func
            self.interval = interval
            self.threadname = 'Interval #%s' %self.interval_id
    
        def run(self):
            func = self.func
            interval = self.interval
            def func_wrapper():
                timeout = Timeout(func_wrapper, interval)
                self.timeout = timeout
                timeout.run()
                func()
            self.t = threading.Timer(self.interval/1000, func_wrapper)
            self.t.name = self.threadname
            self.t.run()
    
        def __repr__(self):
            return '<JS Interval, repeating function %s with interval %s>' %(repr(self.func), self.interval)
    
        def __del__(self):
            self.timeout.__del__()
    
    def setInterval(func, interval):
        """
        Create a JS Interval: func is the function to repeat, interval is the interval (in ms)
        of executing the function.
        """
        temp = Interval(func, interval)
        temp.run()
        idx = int(temp.interval_id)
        del temp
        return idx
    
    
    def clearInterval(interval_id):
        try:
            INTERVALS[str(interval_id)].__del__()
            del INTERVALS[str(interval_id)]
        except KeyError:
            sys.stderr.write('No such interval "Interval #%s"\n' %interval_id)
    
    def setTimeout(func, timeout):
        """
        Create a JS Timeout: func is the function to timeout, timeout is the timeout (in ms)
        of executing the function.
        """
        temp = Timeout(func, timeout)
        temp.run()
        idx = int(temp.timeout_id)
        del temp
        return idx
    
    
    def clearTimeout(timeout_id):
        try:
            TIMEOUTS[str(timeout_id)].__del__()
            del TIMEOUTS[str(timeout_id)]
        except KeyError:
            sys.stderr.write('No such timeout "Timeout #%s"\n' %timeout_id)
    
    # Example of low drift (time) periodic execution of a function.
    import threading
    import time
    
    # Thread that sets 'flag' after 'timeout'
    class timerThread (threading.Thread):
    
        def __init__(self , timeout , flag):
            threading.Thread.__init__(self)
            self.timeout = timeout
            self.stopFlag = False
            self.event = threading.Event()
            self.flag = flag
    
        # Low drift run(); there is only the 'if'
        # and 'set' methods between waits.
        def run(self):
            while not self.event.wait(self.timeout):
                if self.stopFlag:
                    break
                self.flag.set()
    
        def stop(self):
            stopFlag = True
            self.event.set()
    
    # Data.
    printCnt = 0
    
    # Flag to print.
    printFlag = threading.Event()
    
    # Create and start the timer thread.
    printThread = timerThread(3 , printFlag)
    printThread.start()
    
    # Loop to wait for flag and print time.
    while True:
    
        global printCnt
    
        # Wait for flag.
        printFlag.wait()
        # Flag must be manually cleared.
        printFlag.clear()
        print(time.time())
        printCnt += 1
        if printCnt == 3:
            break;
    
    # Stop the thread and exit.
    printThread.stop()
    printThread.join()
    print('Done')
    
    import time, threading
    
    StartTime=time.time()
    
    def action() :
        print('action ! -> time : {:.1f}s'.format(time.time()-StartTime))
    
    
    class setInterval :
        def __init__(self,interval,action) :
            self.interval=interval
            self.action=action
            self.stopEvent=threading.Event()
            thread=threading.Thread(target=self.__setInterval)
            thread.start()
    
        def __setInterval(self) :
            nextTime=time.time()+self.interval
            while not self.stopEvent.wait(nextTime-time.time()) :
                nextTime+=self.interval
                self.action()
    
        def cancel(self) :
            self.stopEvent.set()
    
    # start action every 0.6s
    inter=setInterval(0.6,action)
    print('just after setInterval -> time : {:.1f}s'.format(time.time()-StartTime))
    
    # will stop interval in 5s
    t=threading.Timer(5,inter.cancel)
    t.start()
    
    just after setInterval -> time : 0.0s
    action ! -> time : 0.6s
    action ! -> time : 1.2s
    action ! -> time : 1.8s
    action ! -> time : 2.4s
    action ! -> time : 3.0s
    action ! -> time : 3.6s
    action ! -> time : 4.2s
    action ! -> time : 4.8s
    
    from threading import Timer
    
    def setInterval(timer, task):
        isStop = task()
        if not isStop:
            Timer(timer, setInterval, [timer, task]).start()
    
    def hello():
        print "do something"
        return False # return True if you want to stop
    
    if __name__ == "__main__":
        setInterval(2.0, hello) # every 2 seconds, "do something" will be printed
    
    import time
    import threading
    import signal
    
    # Record the time for the purposes of demonstration 
    start_time=time.time()
    
    class ProgramKilled(Exception):
        """
        An instance of this custom exception class will be thrown everytime we get an SIGTERM or SIGINT
        """
        pass
    
    # Raise the custom exception whenever SIGINT or SIGTERM is triggered
    def signal_handler(signum, frame):
        raise ProgramKilled
    
    # This function serves as the callback triggered on every run of our IntervalThread
    def action() :
        print('action ! -> time : {:.1f}s'.format(time.time()-start_time))
    
    # https://stackoverflow.com/questions/2697039/python-equivalent-of-setinterval
    class IntervalThread(threading.Thread) :
        def __init__(self,interval,action, *args, **kwargs) :
            super(IntervalThread, self).__init__()
            self.interval=interval
            self.action=action
            self.stopEvent=threading.Event()
            self.start()
    
        def run(self) :
            nextTime=time.time()+self.interval
            while not self.stopEvent.wait(nextTime-time.time()) :
                nextTime+=self.interval
                self.action()
    
        def cancel(self) :
            self.stopEvent.set()
    
    def main():
    
        # Handle SIGINT and SIFTERM with the help of the callback function
        signal.signal(signal.SIGTERM, signal_handler)
        signal.signal(signal.SIGINT, signal_handler)
        # start action every 1s
        inter=IntervalThread(1,action)
        print('just after setInterval -> time : {:.1f}s'.format(time.time()-start_time))
    
        # will stop interval in 500s
        t=threading.Timer(500,inter.cancel)
        t.start()
    
        # https://www.g-loaded.eu/2016/11/24/how-to-terminate-running-python-threads-using-signals/
        while True:
            try:
                time.sleep(1)
            except ProgramKilled:
                print("Program killed: running cleanup code")
                inter.cancel()
                break
    
    if __name__ == "__main__":
        main()
    
    import threading, time, signal
    
    from datetime import timedelta
    
    WAIT_TIME_SECONDS = 1
    
    class ProgramKilled(Exception):
        pass
    
    def foo():
        print time.ctime()
    
    def signal_handler(signum, frame):
        raise ProgramKilled
    
    class Job(threading.Thread):
        def __init__(self, interval, execute, *args, **kwargs):
            threading.Thread.__init__(self)
            self.daemon = False
            self.stopped = threading.Event()
            self.interval = interval
            self.execute = execute
            self.args = args
            self.kwargs = kwargs
    
        def stop(self):
                    self.stopped.set()
                    self.join()
        def run(self):
                while not self.stopped.wait(self.interval.total_seconds()):
                    self.execute(*self.args, **self.kwargs)
    
    if __name__ == "__main__":
        signal.signal(signal.SIGTERM, signal_handler)
        signal.signal(signal.SIGINT, signal_handler)
        job = Job(interval=timedelta(seconds=WAIT_TIME_SECONDS), execute=foo)
        job.start()
    
        while True:
              try:
                  time.sleep(1)
              except ProgramKilled:
                  print "Program killed: running cleanup code"
                  job.stop()
                  break
    #output
    #Tue Oct 16 17:47:51 2018
    #Tue Oct 16 17:47:52 2018
    #Tue Oct 16 17:47:53 2018
    #^CProgram killed: running cleanup code
    
    import threading
    
    
    class AlreadyRunning(Exception):
        pass
    
    
    class IntervalNotValid(Exception):
        pass
    
    
    class setInterval():
        def __init__(this, func=None, sec=None, args=[]):
            this.running = False
            this.func = func  # the function to be run
            this.sec = sec            # interval in second
            this.Return = None  # The returned data
            this.args = args
            this.runOnce = None  # asociated with run_once() method
            this.runOnceArgs = None   # asociated with run_once() method
    
            if (func is not None and sec is not None):
                this.running = True
    
                if (not callable(func)):
                    raise TypeError("non-callable object is given")
    
                if (not isinstance(sec, int) and not isinstance(sec, float)):
                    raise TypeError("A non-numeric object is given")
    
                this.TIMER = threading.Timer(this.sec, this.loop)
                this.TIMER.start()
    
        def start(this):
            if (not this.running):
                if (not this.isValid()):
                    raise IntervalNotValid("The function and/or the " +
                                           "interval hasn't provided or invalid.")
                this.running = True
                this.TIMER = threading.Timer(this.sec, this.loop)
                this.TIMER.start()
            else:
                raise AlreadyRunning("Tried to run an already run interval")
    
        def stop(this):
            this.running = False
    
        def isValid(this):
            if (not callable(this.func)):
                return False
    
            cond1 = not isinstance(this.sec, int)
            cond2 = not isinstance(this.sec, float)
            if (cond1 and cond2):
                return False
            return True
    
        def loop(this):
    
            if (this.running):
                this.TIMER = threading.Timer(this.sec, this.loop)
                this.TIMER.start()
                function_, Args_ = this.func, this.args
    
                if (this.runOnce is not None):  # someone has provide the run_once
                    runOnce, this.runOnce = this.runOnce, None
                    result = runOnce(*(this.runOnceArgs))
                    this.runOnceArgs = None
    
                    # if and only if the result is False. not accept "None"
                    # nor zero.
                    if (result is False):
                        return  # cancel the interval right now
    
                this.Return = function_(*Args_)
    
        def change_interval(this, sec):
    
            cond1 = not isinstance(sec, int)
            cond2 = not isinstance(sec, float)
            if (cond1 and cond2):
                raise TypeError("A non-numeric object is given")
    
            # prevent error when providing interval to a blueprint
            if (this.running):
                this.TIMER.cancel()
    
            this.sec = sec
    
            # prevent error when providing interval to a blueprint
            # if the function hasn't provided yet
            if (this.running):
                this.TIMER = threading.Timer(this.sec, this.loop)
                this.TIMER.start()
    
        def change_next_interval(this, sec):
    
            if (not isinstance(sec, int) and not isinstance(sec, float)):
                raise TypeError("A non-numeric object is given")
    
            this.sec = sec
    
        def change_func(this, func, args=[]):
    
            if (not callable(func)):
                raise TypeError("non-callable object is given")
    
            this.func = func
            this.args = args
    
        def run_once(this, func, args=[]):
            this.runOnce = func
            this.runOnceArgs = args
    
        def get_return(this):
            return this.Return
    
    import time
    
    def interval(name="world"):
      print(f"Hello {name}!")
    
    # function named interval will be called every two seconds
    # output: "Hello world!"
    interval1 = setInterval(interval, 2) 
    
    # function named interval will be called every 1.5 seconds
    # output: "Hello Jane!"
    interval2 = setInterval(interval, 1.5, ["Jane"]) 
    
    time.sleep(5) #stop all intervals after 5 seconds
    interval1.stop()
    interval2.stop()
    
    def sleep_until_next_interval(self, seconds):
        now = time.time()
        fall_asleep = seconds - now % seconds
        time.sleep(fall_asleep)
    
    while True:
        sleep_until_next_interval(10) # 10 seconds - worktime
        # work here
    
    import functools
    import sched, time
    
    s = sched.scheduler(time.time, time.sleep)
    
    def setInterval(sec):
        def decorator(func):
            @functools.wraps(func)
            def wrapper(*argv, **kw):
                setInterval(sec)(func)
                func(*argv, **kw)
            s.enter(sec, 1, wrapper, ())
            return wrapper
        s.run()
        return decorator
    
    
    @setInterval(sec=3)
    def testInterval():
      print ("test Interval ")
    
    testInterval()
    
    import time
    
    delay = 10 # Seconds
    
    def setInterval():
        print('I print in intervals!')
        time.sleep(delay)
        setInterval()