<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 async def multi_get(self, keys, loads_fn=None, namespace=None, _conn=None):
 """ Get multiple values from the cache, values not found are Nones. :param keys: list of str :param loads_fn: callable alternative to use as loads function :param namespace: str alternative namespace to use :param timeout: int or float in seconds specifying maximum timeout for the operations to last :returns: list of objs :raises: :class:`asyncio.TimeoutError` if it lasts more than self.timeout """

        start = time.monotonic()
        loads = loads_fn or self._serializer.loads

        ns_keys = [self.build_key(key, namespace=namespace) for key in keys]
        values = [
            loads(value)
            for value in await self._multi_get(
                ns_keys, encoding=self.serializer.encoding, _conn=_conn
            )
        ]

        logger.debug(
            "MULTI_GET %s %d (%.4f)s",
            ns_keys,
            len([value for value in values if value is not None]),
            time.monotonic() - start,
        )
        return values