首页 > 解决方案 > Python周期性定时器中断

问题描述

(如何)我可以在 Python 中激活周期性定时器中断吗?例如有一个主循环和一个定时器中断,应该定期触发:

def handler():
    # do interrupt stuff

def main():
    init_timer_interrupt(<period>, <handler>);
    while True:
        # do cyclic stuff

if __name__ == "__main__":
    main();

我已经尝试了在 Python 中执行周期性操作中找到的示例,但它们都要么阻止执行main(),要么开始产生新线程。

标签: pythontimerinterruptperiodic-task

解决方案


任何解决方案都将阻塞 main(),或者如果不是进程,则生成新线程。

最常用的解决方案是:

threading.Timer( t, function).start()

它可以递归使用,一个简单的应用是:

import threading
import time

class Counter():
    def __init__(self, increment):
        self.next_t = time.time()
        self.i=0
        self.done=False
        self.increment = increment
        self._run()

    def _run(self):
        print("hello ", self.i)
        self.next_t+=self.increment
        self.i+=1
        if not self.done:
            threading.Timer( self.next_t - time.time(), self._run).start()
    
    def stop(self):
        self.done=True

a=Counter(increment = 1)
time.sleep(5)
a.stop()

这个解决方案不会随着时间的推移而漂移


推荐阅读