@Helow19274

Как сделать асинхронный деструктор?

Есть класс. В нём создается aiohttp.ClientSession. В методах эта сессия активно используется.
Как сделать, чтобы __del__ закрывал сессию?

Насколько я знаю, эта функция не может быть асинхронной.
  • Вопрос задан
  • 672 просмотра
Пригласить эксперта
Ответы на вопрос 2
@dmtrrr
Backend developer
https://docs.python.org/3/reference/datamodel.html...
Called when the instance is about to be destroyed. This is also called a finalizer or (improperly) a destructor.

Общая рекомендация не использовать этот метод.
Ответ написан
@lega
Такой хак работаетс с 3.6+, aclose вызовется при закрытии loop
import asyncio

class Test():
    async def aclose(self):
        print('hook during close')

test = Test()

async def main():
    asyncio.get_event_loop()._asyncgen_firstiter_hook(test)
    await asyncio.sleep(1)

asyncio.run(main())


Ещё вариант, CancelledError происходит при остановке loop, тогда можно и вызвать свой код
import asyncio

async def main():
    print('start')

    async def on_stop():
        try:
            await asyncio.sleep(10**10)
        except asyncio.CancelledError:
            pass
        print('stopping start')
        await asyncio.sleep(1)
        print('stopping end')
    asyncio.ensure_future(on_stop())

    await asyncio.sleep(1)

asyncio.run(main())
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы