<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def future(self, request_iterator, timeout=None, metadata=None, credentials=None):
 """Asynchronously invokes the underlying RPC on the client. Args: request_iterator: An ASYNC iterator that yields request values for the RPC. timeout: An optional duration of time in seconds to allow for the RPC. If None, the timeout is considered infinite. metadata: Optional :term:`metadata` to be transmitted to the service-side of the RPC. credentials: An optional CallCredentials for the RPC. Returns: An object that is both a Call for the RPC and a Future. In the event of RPC completion, the return Call-Future's result value will be the response message of the RPC. Should the event terminate with non-OK status, the returned Call-Future's exception value will be an RpcError. """

        return _utils.wrap_future_call(
                    self._inner.future(
                        _utils.WrappedAsyncIterator(request_iterator, self._loop),
                        timeout,
                        metadata,
                        credentials
                    ),
                    self._loop,
                    self._executor)