docs: def read_sync(self, timeout=None):
          '''
          Read a message from an IPC socket
  
          The socket must already be connected.
          The associated IO Loop must NOT be running.
          :param int timeout: Timeout when receiving message
          :return: message data if successful. None if timed out. Will raise an
                   exception for all other error conditions.
          '''
          if self.saved_data:
              return self.saved_data.pop(0)
  
          self._sync_ioloop_running = True
          self._read_sync_future = self._read_sync(timeout)
          self.io_loop.start()
          self._sync_ioloop_running = False
  
          ret_future = self._read_sync_future
          self._read_sync_future = None
          return ret_future.result()