аснихронный __exit__

Я использую aiohttp. Мне необходимо сделать закрытие сессии при уничтожении объекта. Но это запрещено делать асинхронно. Есть ли способ реализовать это в python?

class X:
    def __init__(self):
        self.session = aiohttp.ClientSession()

    def __exit__(self, exc_type, exc_val, exc_tb):
        await self.session.close()

    async def r(self):
        resp = await self.session.get('http://httpbin.org/get')

Возможно, именно для этого используется асинхронный контекст. Если я прав, объясните, как им пользоваться.


Ответы (1 шт):

Автор решения: eri

Есть в PEP492 __aexit__() в python3.5+

An example of an asynchronous context manager:

class AsyncContextManager: async def aenter(self): await log('entering context')

async def __aexit__(self, exc_type, exc, tb):
    await log('exiting context')

New Syntax A new statement for asynchronous context managers is proposed:

async with EXPR as VAR:
    BLOCK

но если очень хочется, то

from asgiref.sync import async_to_sync
...
    async_to_sync(self.session.close)()
→ Ссылка