def _run_agent(agent_dir: Union[PathLike, str], stop_event: Event, log_level: Optional[str] = None) -> None: """ Load and run agent in a dedicated process. :param agent_dir: agent configuration directory :param stop_event: multithreading Event to stop agent run. :param log_level: debug level applied for AEA in subprocess :return: None """ import asyncio # pylint: disable=import-outside-toplevel import select # pylint: disable=import-outside-toplevel import selectors # pylint: disable=import-outside-toplevel if hasattr(select, "kqueue"): # pragma: nocover # cause platform specific selector = selectors.SelectSelector() loop = asyncio.SelectorEventLoop(selector) # type: ignore asyncio.set_event_loop(loop) _set_logger(log_level=log_level) agent = load_agent(agent_dir) def stop_event_thread() -> None: try: stop_event.wait() except (KeyboardInterrupt, EOFError, BrokenPipeError) as e: # pragma: nocover _default_logger.debug( f"Exception raised in stop_event_thread {e} {type(e)}. Skip it, looks process is closed." ) finally: _default_logger.debug( "_run_agent: stop event raised. call agent.stop") agent.runtime.stop() Thread(target=stop_event_thread, daemon=True).start() try: agent.start() except KeyboardInterrupt: # pragma: nocover _default_logger.debug("_run_agent: keyboard interrupt") except BaseException as e: # pragma: nocover _default_logger.exception("exception in _run_agent") exc = AEAException(f"Raised {type(e)}({e})") exc.__traceback__ = e.__traceback__ raise exc finally: _default_logger.debug("_run_agent: call agent.stop") agent.stop()
def _run_agent(agent_dir: Union[PathLike, str], stop_event: Event, log_level: Optional[str] = None) -> None: """ Load and run agent in a dedicated process. :param agent_dir: agent configuration directory :param stop_event: multithreading Event to stop agent run. :param log_level: debug level applied for AEA in subprocess :return: None """ _set_logger(log_level=log_level) agent = load_agent(agent_dir) def stop_event_thread(): try: stop_event.wait() except (KeyboardInterrupt, EOFError, BrokenPipeError) as e: # pragma: nocover logger.error( f"Exception raised in stop_event_thread {e} {type(e)}. Skip it, looks process is closed." ) finally: agent.stop() Thread(target=stop_event_thread, daemon=True).start() try: agent.start() except KeyboardInterrupt: # pragma: nocover logger.debug("_run_agent: keyboard interrupt") except BaseException as e: # pragma: nocover logger.exception("exception in _run_agent") exc = AEAException(f"Raised {type(e)}({e})") exc.__traceback__ = e.__traceback__ raise exc finally: agent.stop()