def start(self, timeout=None):
        """Start the client in a new thread.

        Parameters
        ----------
        timeout : float in seconds
            Seconds to wait for client thread to start. Do not specify a
            timeout if start() is being called from the same ioloop that this
            client will be installed on, since it will block the ioloop without
            progressing.

        """
        if self._running.isSet():
            raise RuntimeError("Device client already started.")
        # Make sure we have an ioloop
        self.ioloop = self._ioloop_manager.get_ioloop()
        if timeout:
            t0 = self.ioloop.time()
        self._ioloop_manager.start(timeout)
        self.ioloop.add_callback(self._install)
        if timeout:
            remaining_timeout = timeout - (self.ioloop.time() - t0)
            self.wait_running(remaining_timeout)
Start the client in a new thread.

        Parameters
        ----------
        timeout : float in seconds
            Seconds to wait for client thread to start. Do not specify a
            timeout if start() is being called from the same ioloop that this
            client will be installed on, since it will block the ioloop without
            progressing.