agentPool.py 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. # -*- coding: utf-8 -*-
  2. from threading import RLock
  3. from typing import List
  4. from yacs.config import CfgNode as CN
  5. from digitalHuman.utils import logger
  6. from .agentBase import BaseAgent
  7. from .core import AgentFactory
  8. __all__ = ["AgentPool"]
  9. class AgentPool():
  10. singleLock = RLock()
  11. _init = False
  12. def __init__(self):
  13. if not self._init:
  14. self._pool = dict()
  15. self._init = True
  16. # Single Instance
  17. def __new__(cls, *args, **kwargs):
  18. with AgentPool.singleLock:
  19. if not hasattr(cls, '_instance'):
  20. AgentPool._instance = super().__new__(cls)
  21. return AgentPool._instance
  22. def __del__(self):
  23. self._pool.clear()
  24. self._init = False
  25. def setup(self, config: CN):
  26. for cfg in config.SUPPORT_LIST:
  27. self._pool[cfg.NAME] = AgentFactory.create(cfg)
  28. logger.info(f"[AgentPool] AGENT Engine {cfg.NAME} is created.")
  29. logger.info(f"[AgentPool] AGENT Engine default is {config.DEFAULT}.")
  30. def get(self, name: str) -> BaseAgent:
  31. if name not in self._pool:
  32. raise KeyError(f"[AgentPool] No such engine: {name}")
  33. return self._pool[name]
  34. def list(self) -> List[str]:
  35. return list(self._pool.keys())