Очистка asyncio all_tasks () во время выполнения - PullRequest
0 голосов
/ 03 июля 2019

У меня есть приложение aiohttp, и запрос вызывает (поддельное!) Исключение:

ERROR:aiohttp.server:Error handling request
Traceback (most recent call last):
  File "C:\Program Files\Python36\lib\site-packages\aiohttp\web_protocol.py", line 418, in start
    resp = await task
  File "C:\Program Files\Python36\lib\site-packages\aiohttp\web_app.py", line 458, in _handle
    resp = await handler(request)
  File "webservice.py", line 60, in handle_status
    raise ValueError('*******************')

Я жду ~ 2 минуты и закрываю приложение через CTRL + C.Это вызывает `KeyboardInterrupt". Внутри обработчика исключений запускается следующий код.

def close_loop(loop):
    """ Gracefully close down the event loop.
    """
    # Log any excepting tasks using the usual logging module.
    tasks = asyncio.Task.all_tasks(loop=loop)
    exceptions = [(task, task.exception()) for task in tasks if task.done()]
    exceptions = [(task, err) for task, err in exceptions if err]
    for task, err in exceptions:
        log.error(f'close_loop reports exception:\n\t{task}\n\t{err}')

    # Handle shutdown gracefully by waiting for all tasks to be cancelled.
    log.debug(f'close_loop: gathering tasks: {tasks}')
    tasks = asyncio.gather(*tasks, loop=loop, return_exceptions=True)
    tasks.add_done_callback(lambda task: loop.stop())
    tasks.cancel()

    # Keep the event loop running until it is either destroyed or all
    # tasks have really terminated.
    log.debug('close_loop: wait for cancellation')
    while not tasks.done() and not loop.is_closed():
        loop.run_forever()

Затем в журнал записываются исключения, сделанные на 2 минуты раньше. См. Ниже.

ERROR:mymodule.run:\close_loop reports exception:
    <Task finished coro=<Application._handle() done, defined at C:\Program Files\Python36\lib\site-packages\aiohttp\web_app.py:428> exception=ValueError('*******************',)>
    *******************

Я бы предпочел регистрировать и приводить в порядок эти исключения во время работы приложения. Мне не нравится идея, что куча этих исключений будет накапливаться в памяти до тех пор, пока приложение не существует.

Что лучшепрактика для решения исключительных задач, торчащих в asyncio? Это поведение определено где-нибудь?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...