code: def start(self, timeout=None):
          
          if not self._ioloop:
              raise RuntimeError('Call get_ioloop() or set_ioloop() first')
  
          self._ioloop.add_callback(self._running.set)
  
          if self._ioloop_managed:
              self._run_managed_ioloop()
          else:            #  TODO this seems inconsistent with what the docstring describes
              self._running.set()
  
          if timeout:
              return self._running.wait(timeout)
docs: Start managed ioloop thread, or do nothing if not managed.
  
          If a timeout is passed, it will block until the the event loop is alive
          (or the timeout expires) even if the ioloop is not managed.