'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.'

def select_servers(self, selector, server_selection_timeout=None, address=None):

    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):
            if ((server_timeout == 0) or (now > end_time)):
                raise ServerSelectionTimeoutError(self._error_message(selector))
            self._ensure_opened()
            self._request_check_all()
            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]
