class OLAThread(Thread): """The thread which runs the OLA Client.""" def __init__(self, ola_client): super(OLAThread, self).__init__() self._client = ola_client self._ss = None # created in run() def run(self): self._ss = SelectServer() self._ss.AddReadDescriptor(self._client.GetSocket(), self._client.SocketReady) self._ss.Run() logging.info('OLA thread finished') def Stop(self): if self._ss is None: logging.critical( 'OLAThread.Stop() called before thread was running') return logging.info('Stopping OLA thread') self._ss.Terminate() def Execute(self, cb): self._ss.Execute(cb) def FetchUniverses(self): return self.MakeSyncClientCall(self._client.FetchUniverses) def FetchUIDList(self, *args): return self.MakeSyncClientCall(self._client.FetchUIDList, *args) def RunRDMDiscovery(self, *args): return self.MakeSyncClientCall(self._client.RunRDMDiscovery, *args) def MakeSyncClientCall(self, method, *method_args): """Turns an async call into a sync (blocking one). Args: wrapper: the ClientWrapper object method: the method to call *method_args: Any arguments to pass to the method Returns: The arguments that would have been passed to the callback function. """ global args_result event = Event() def Callback(*args, **kwargs): global args_result args_result = args event.set() def RunMethod(): method(*method_args, callback=Callback) self._ss.Execute(RunMethod) event.wait() return args_result
def run(self): self._ss = SelectServer() self._ss.AddReadDescriptor(self._client.GetSocket(), self._client.SocketReady) self._ss.Run() logging.info('OLA thread finished')