from threading import Thread from queue import Queue import time class Input: _t = None _stop = False _q = Queue() interval = 1 _read_cb = None def __init__(self, read_cb) -> None: self._read_cb = read_cb def start(self): if not self._t: self._stop = False self._t = Thread(target = self._main) self._t.setDaemon(True) self._t.start() def stop(self): if self._t: self._stop = True self._t.join() self._t = None def read(self): while not self._q.empty(): yield self._q.get() def _main(self): while not self._stop: start_time = time.monotonic() self._read_cb() end_time = time.monotonic() remaining = self.interval + start_time - end_time if remaining > 0: time.sleep(remaining)