Exemple #1
0
async def shutdown(loop: AbstractEventLoop):
    tasks = [
        task for task in asyncio.all_tasks(loop)
        if task is not asyncio.tasks.current_task(loop)
    ]
    list(map(lambda task: task.cancel(), tasks))
    await asyncio.gather(*tasks, return_exceptions=True)
    loop.stop()
Exemple #2
0
def error_handler(loop: AbstractEventLoop, context: Dict[str, Any]) -> None:
    if isinstance(context["exception"], AdapterException):
        try:
            loop.stop()
            loop.close()
        except Exception as exception:
            logging.debug(exception)
    else:
        logging.debug(context)
Exemple #3
0
def test_locallogstreamer(capsys, event_loop: AbstractEventLoop) -> None:
    logger = StreamingLogger()
    logger.reset("xxx", "yyy")
    streamer = log_streamer.LocalLogStreamer(
        [ToyHandler()],
        logger,
    )

    async def _toy_logging(logger: StreamingLogger,
                           streamer: log_streamer.LocalLogStreamer) -> None:
        await asyncio.sleep(0.1)
        # logging by logger
        logger.log("test\n")
        # log will be sent into streamer, and handler, then printted out
        await asyncio.sleep(0.3)
        streamer.handle_exit(SIGINT, None)

    event_loop.create_task(streamer.entry_point())
    event_loop.run_until_complete(_toy_logging(logger, streamer))
    event_loop.stop()

    captured = capsys.readouterr()
    assert captured.out == "toy-test\n"
Exemple #4
0
async def shutdown(  # type: ignore[no-untyped-def]
        loop: AbstractEventLoop,
        logger: logging.Logger,
        teardown: AsyncFunction,
        signal=None  # a named enum of ints
) -> None:
    '''Cancel active tasks for shutdown'''
    if signal:
        logger.info(f'Received exit signal {signal.name}')
    else:
        logger.info('Unexpeced shutdown initiated')
        await asyncio.sleep(5)  # stall error loops

    if teardown:
        try:
            await teardown()
        except Exception:
            logger.exception('Error during teardown function')
            logger.error('Exiting uncleanly')
            sys.exit(1)

    tasks = [
        t for t in asyncio.Task.all_tasks() if t is not asyncio.current_task()
    ]

    logger.info(f'Cancelling {len(tasks)} tasks')
    [task.cancel() for task in tasks]

    try:
        await asyncio.gather(*tasks, return_exceptions=True)
    except Exception:
        logger.exception('Error during loop task cancellation')
        logger.error('Exiting uncleanly')
        sys.exit(1)

    loop.stop()
Exemple #5
0
def sigterm_handler(logger: Logger, event_loop: AbstractEventLoop) -> None:
    if event_loop.is_running():
        logger.info('Received SIGTERM')
        event_loop.stop()
Exemple #6
0
def error_handler(loop: AbstractEventLoop, context: Dict[str, Any]) -> None:
    if isinstance(context["exception"], AdapterException):
        loop.stop()
        loop.close()
Exemple #7
0
def sigterm_handler(logger: Logger, event_loop: AbstractEventLoop) -> None:
    if event_loop.is_running():
        logger.info('Received SIGTERM')
        event_loop.stop()