def acquire(self, host: str, port: int, use_ssl: bool=False,
                host_key: Optional[Any]=None) \
            -> Union[Connection, SSLConnection]:
        '''Return an available connection.

        Args:
            host: A hostname or IP address.
            port: Port number.
            use_ssl: Whether to return a SSL connection.
            host_key: If provided, it overrides the key used for per-host
                connection pooling. This is useful for proxies for example.

        Coroutine.
        '''
        assert isinstance(port, int), 'Expect int. Got {}'.format(type(port))
        assert not self._closed

        yield from self._process_no_wait_releases()

        if use_ssl:
            connection_factory = functools.partial(
                self._ssl_connection_factory, hostname=host)
        else:
            connection_factory = functools.partial(
                self._connection_factory, hostname=host)

        connection_factory = functools.partial(
            HappyEyeballsConnection, (host, port), connection_factory,
            self._resolver, self._happy_eyeballs_table,
            is_ssl=use_ssl
        )

        key = host_key or (host, port, use_ssl)

        with (yield from self._host_pools_lock):
            if key not in self._host_pools:
                host_pool = self._host_pools[key] = HostPool(
                    connection_factory,
                    max_connections=self._max_host_count
                )
                self._host_pool_waiters[key] = 1
            else:
                host_pool = self._host_pools[key]
                self._host_pool_waiters[key] += 1

        _logger.debug('Check out %s', key)

        connection = yield from host_pool.acquire()
        connection.key = key

        # TODO: Verify this assert is always true
        # assert host_pool.count() <= host_pool.max_connections
        # assert key in self._host_pools
        # assert self._host_pools[key] == host_pool

        with (yield from self._host_pools_lock):
            self._host_pool_waiters[key] -= 1

        return connection
Return an available connection.

        Args:
            host: A hostname or IP address.
            port: Port number.
            use_ssl: Whether to return a SSL connection.
            host_key: If provided, it overrides the key used for per-host
                connection pooling. This is useful for proxies for example.

        Coroutine.