docs: def select_servers(self,
                         selector,
                         server_selection_timeout=None,
                         address=None):
          """Return a list of Servers matching selector, or time out.
  
          :Parameters:
            - `selector`: function that takes a list of Servers and returns
              a subset of them.
            - `server_selection_timeout` (optional): maximum seconds to wait.
              If not provided, the default value common.SERVER_SELECTION_TIMEOUT
              is used.
            - `address`: optional server address to select.
  
          Calls self.open() if needed.
  
          Raises exc:`ServerSelectionTimeoutError` after
          `server_selection_timeout` if no matching servers are found.
          """
          if server_selection_timeout is None:
              server_timeout = self._settings.server_selection_timeout
          else:
              server_timeout = server_selection_timeout
  
          with self._lock:
              self._description.check_compatible()
  
              now = _time()
              end_time = now + server_timeout
              server_descriptions = self._description.apply_selector(
                  selector, address)
  
              while not server_descriptions:
                  # No suitable servers.
                  if server_timeout == 0 or now > end_time:
                      raise ServerSelectionTimeoutError(
                          self._error_message(selector))
  
                  self._ensure_opened()
                  self._request_check_all()
  
                  # Release the lock and wait for the topology description to
                  # change, or for a timeout. We won't miss any changes that
                  # came after our most recent apply_selector call, since we've
                  # held the lock until now.
                  self._condition.wait(common.MIN_HEARTBEAT_INTERVAL)
                  self._description.check_compatible()
                  now = _time()
                  server_descriptions = self._description.apply_selector(
                      selector, address)
  
              return [self.get_server_by_address(sd.address)
                      for sd in server_descriptions]