def find_runner(self, runner_id: int, runner_name: str) -> IRunner:
        """Find runner

        Args:
             runner_id: id in runner table
             runner_name: {item_type}_{item_id}
        """
        with self._lock:
            key = self.cache_key(runner_id, runner_name)
            obj = self._cache.get(key, None)
            if obj:
                return obj
            item_type, item_id = runner_name.rsplit('_', 1)
            if item_type not in self.runner_fn:
                logging.error(
                    f'failed to find item_type {item_type} in runner_fn, '
                    f'please register it in global_runner_fn')
                raise ValueError(f'unknown item_type {item_type} in runner')
            obj = self.runner_fn[item_type](int(item_id))
            self._cache[key] = obj
            return obj
Find runner

        Args:
             runner_id: id in runner table
             runner_name: {item_type}_{item_id}
        
web_console_v2/api/fedlearner_webconsole/composer/runner_cache.py