code: def cleanup(self):
          self.pre_exit_trigger = True
          self.logger.info("Shutting down %s, please wait a moment.", self.name)
          for t in threading.enumerate():
              if isinstance(t, TimerClass):
                  t.cancel()
          self.logger.debug('Timers cancelled')
          for i in self.objects:
              i.cleanup()
          self.logger.debug('Sensors etc cleanups done')
          for ser in (i for i in self.services if isinstance(i, AbstractUserService)):
              ser.cleanup_system()
          self.logger.debug('User services cleaned up')
          if self.worker_thread.is_alive():
              self.worker_thread.stop()
          self.logger.debug('Worker thread really stopped')
          for ser in (i for i in self.services if isinstance(i, AbstractSystemService)):
              ser.cleanup_system()
          self.logger.debug('System services cleaned up')
          threads = list(t.name for t in threading.enumerate() if t.is_alive() and not t.daemon)
          if threads:
              self.logger.info('After cleanup, we have still the following threads '
                               'running: %s', ', '.join(threads))