Заменить close на aclose; пофиксить закрытие клиента (добавив loop аргументом при инициализации)
Woxazu opened this issue · 5 comments
- В модуле AioQiwip2p в функции
__aexit__
вместоself.client.aclose()
стоитself.client.close()
, как будто клиент синхронный. Приводит к ошибке 'AsyncClient' object has no attribute 'close'. После замены я заметил другую ошибку: - если у меня есть модуль, в котором происходит инициализация клиента
p2p = AioQiwiP2P(auth_key=qiwi_key)
и несколько async функций, внутри которых with, например:
async def bill(bill_id, amount, lifetime= bill_lifetime):
async with p2p:
new_bill = await p2p.bill(bill_id= bill_id, amount= amount, lifetime= lifetime, comment= bill_id)
return new_bill.pay_url, new_bill.bill_id
async def close_bill(bill_id):
async with p2p:
return await p2p.reject(bill_id= bill_id)
То при обращении к первой соответсвенно срабатывает with и триггерится aexit после окончания код блока, и это вроде логично. Но тогда при обращении ко второй функции из другого модуля этот клиент уже закрывается: RuntimeError: Cannot send a request, as the client has been closed. Если написать аналогичный код на httpx или другой асинк либе, то инициализированный клиент, очевидно, не умрет. Фиксится добавлением аргумента loop при инициализации, чтобы узнать в каком мы цикле и не убивать сущность. Да и в целом создавать клиент каждый раз при новом обращении против мануалов httpx из-за неэффективности
По поводу первого: https://github.com/WhiteApfel/pyQiwiP2P/blob/master/pyqiwip2p/AioQiwip2p.py#L80
Всё адекватненько
Клиент создаётся один раз: при инициализации объекта AioQiwiP2P
или QiwiP2P
Можно использовать await p2p.client.aclose()
, если планируется использовать множество раз, конструкция async with
сделана для незабывания о закрытии и имеет право не использоваться
по поводу второго, тогда это скорее не баг а enhancement от меня. вопросов больше не осталось
pip install...
Стабильная версия (stable, v1.0.1) не имеет асинхронного клиента.
Версия 2.* (master) с асинхронным клиентом находится в статусе ленивой разработки и является нестабильной. Для установки нестабильных (альфа, бета и прочие) версий используется команда
python -m pip install --pre -U pyqiwip2p
Актуальная на данный момент версия v2.0a14 (pypi) ошибки из первого пунта не содержит