예제 #1
0
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()
예제 #2
0
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()