class GPSPoller(threading.Thread): def __init__(self): threading.Thread.__init__(self) self.session = None self.current_value = Location() self._stopped = False self._skipped = 0 def connect(self): if self.session: return try: self.session = GPS(mode=WATCH_ENABLE) except OSError: return def get_location(self): return self.current_value def stop(self): self._stopped = True def run(self): while not self._stopped: self.current_value.check() self.connect() if not self.session: time.sleep(1) continue try: v = self.session.next() if 'lat' in dict(v): alt = None if 'alt' in dict(v): alt = v['alt'] self.current_value.set(v['lat'], v['lon'], v['speed'], alt) self._skipped = 0 except StopIteration: self._skipped += 1 if self._skipped > 20: self.session = None time.sleep(0.5) except client: logger.exception("Client exception") time.sleep(0.5) except Exception: logger.exception("Unknown exception") time.sleep(0.5)