import logging from threading import Event, Thread logger = logging.getLogger(__name__) class ThreadWorker(Thread): def __init__(self, queue, name=None): Thread.__init__(self, name=name, daemon=True) self._running = True self._work_arrived = Event() self.queue = queue self.start() def stop(self): if self._running: logger.info(f"{self.name}: stopping..") self._running = False self._work_arrived.set() # to get it going self.join(None) def run(self): logger.info(f"{self.name}: started") while self._running: self._work_arrived.wait() try: work = self.queue.popleft() work() except IndexError: # thrown by self.queue.popleft() if no more work! self._work_arrived.clear() logger.info(f"{self.name}: stopped") self.queue = None def signal_work_arrived(self): self._work_arrived.set() def is_busy(self): return self._work_arrived.is_set() def is_idle(self): return not self._work_arrived.is_set()