import queue import threading class Event(object): def __init__(self, etype): self._type = etype @property def type(self): return self._type class Events(threading.Thread): def __init__(self, callback): super(Events, self).__init__() self.queue = queue.Queue() self.daemon = True self.callback = callback self.name = 'EVENT-QUEUE' self._stopper = threading.Event() def put(self, etype): self.queue.put(etype) def stopit(self): self._stopper.set() def run(self): while not self._stopper.is_set(): try: # get event type ev_type = self.queue.get(True, 1) except queue.Empty: ev_type = 'Empty' except(BaseException, Exception): ev_type = None if ev_type in (self.SystemEvent.RESTART, self.SystemEvent.SHUTDOWN, None, 'Empty'): if ev_type in ('Empty',): continue from sickgear import logger logger.debug(f'Callback {self.callback.__name__}(event type:{ev_type})') try: # perform callback if we got an event type self.callback(ev_type) # event completed self.queue.task_done() except queue.Empty: pass # exiting thread self._stopper.clear() # System Events class SystemEvent(Event): RESTART = 'RESTART' SHUTDOWN = 'SHUTDOWN'