/
kotkov
/
eco
Обзор
Документация
Войти
/
kotkov
/
eco
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
dev
base.py
87 строк
3 KB
Arseny Kotkov
Add multithreading logging to file with log.ecolog
04 мар 2025, 08:01
04 мар 2025, 08:01
03de008
Код
Авторство
О чём код?
import json from rpc import RPC, RPCMeta, Message from utils import Socket class AgentNotRegistered(Exception): def __init__(self, message): super().__init__(message) class BaseAgent(RPC, metaclass=RPCMeta): """ Базовый агент. """ def __init__(self): super().__init__(self) self._name: str = "" # Имя, по которому можно обратиться к агенту. self._agents: list = [] # Список известных агентов. self._aaa: Socket = Socket() # Адрес используемого центра # регистрации. @property def name(self): return self._name @name.setter def name(self, value): self._name = value @property def agents(self): return self._agents @property def aaa(self): return self._aaa @aaa.setter def aaa(self, value: Socket): self._aaa = value def register(self): """ Зарегистрироваться в центре регистрации. """ # TODO: регистрирует свой интерфейс (свои RPC-методы) # import inspect # for name, member in inspect.getmembers(self): # if inspect.isfunction(member): # if name in self.public_methods: # ecolog(member) # else: # continue # sig = inspect.signature(member) # params = sig.parameters # for k, v in params.items(): # if isinstance(v.annotation, list): # for role in v.annotation: # ecolog(role.__module__, role.__name__, sep=".") # Сообщаем центру регистрации своё имя, IP, порт и методы, # доступные для вызова через RPC. return self.call(self.aaa.ip, self.aaa.port, Message(method='register', params=[ self.name, self.ip, self.port, self.public_methods ])) def sync(self): """ Синхронизируем информацию о зарегистрированных агентах, сохраняем её в буфер. """ response = self.call(self.aaa.ip, self.aaa.port, Message(method='get_registered_agents', params=[])) self._agents = json.loads(response) def call_agent(self, name: str, message: Message): """ RPC-вызов зарегистрированного агента по его имени. """ # Обновляем список зарегистрированных агентов. self.sync() # Находим агента по имени. agent = None for element in self.agents: if element['name'] == name: agent = element if agent is None: return AgentNotRegistered(f"Агент {name} не числится в известных агентах.") return self.call(agent['ip'], agent['port'], message)