docs: def get(self, blocking=True):
      """Gets a connection.
  
      Args:
        blocking: Whether to block when max_size connections are already in use.
          If false, may return None.
  
      Returns:
        A connection to the database.
  
      Raises:
        PoolAlreadyClosedError: if close() method was already called on
        this pool.
      """
      if self.closed:
        raise PoolAlreadyClosedError("Connection pool is already closed.")
  
      # NOTE: Once we acquire capacity from the semaphore, it is essential that we
      # return it eventually. On success, this responsibility is delegated to
      # _ConnectionProxy.
      if not self.limiter.acquire(blocking=blocking):
        return None
      c = None
      # pop is atomic, but if we did a check first, it would not be atomic with
      # the pop.
      try:
        c = self.idle_conns.pop()
      except IndexError:
        # Create a connection, release the pool allocation if it fails.
        try:
          c = self.connect_func()
        except Exception:
          self.limiter.release()
          raise
      return _ConnectionProxy(self, c)