code: def _select_servers_loop(self, selector, timeout, address):
          
          now = _time()
          end_time = now + timeout
          server_descriptions = self._description.apply_selector(
              selector, address, custom_selector=self._settings.server_selector)
  
          while not server_descriptions:
              # No suitable servers.
              if 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,
                  custom_selector=self._settings.server_selector)
  
          self._description.check_compatible()
          return server_descriptions
docs: select_servers() guts. Hold the lock when calling this.