我想使用http客户端作为类成员,但del函数无法调用waitclient.aclose()
。
e、 g:
import httpx
class Foo(object):
def __init__(self):
self.client = httpx.AsyncClient()
def __del__(self):
await self.client.aclose()
参考:https://www.python-httpx.org/async/#opening-and-closing-clients
如何安全关闭
Tags:
虽然这是一个老问题,但我可能有一些令人信服的东西要分享,因为我有一个类似的情况。按照@Isabi的观点(回答2020-12-28),您需要使用事件循环将客户机与您的操作分离,然后手动控制其生命周期
在我的例子中,我需要对客户机进行更多的控制,这样我就可以将请求与发送分开,并在关闭客户机时利用会话池等。下面提供的示例演示了如何使用http.AsyncClient作为类成员,并在退出时关闭它
在解决这个问题的过程中,我遇到了一个异步学习曲线,但很快发现它是。。。其实不算太坏。它不像Go[lang]那样干净,但在摆弄它一两个小时后就开始有意义了。完全披露:我仍然怀疑这是否100%正确
关键部分在
__init__
、close
和__del__
方法中。对我来说,还有待回答的是,在上下文管理器中使用http.AsyncClient是否真的会重置连接,等等。我只能假设它会重置连接,因为这对我来说是有意义的。我不禁要问:这有必要吗由于我最近一直在使用Go,我最初编写了一些带有闭包的方法,因为它们似乎有意义;最后,通过将闭包转换为类方法,我能够(IMHO)在分离/封装/隔离之间提供良好的平衡
由此产生的使用界面感觉平易近人且易于阅读——我看到自己正在编写基于类的异步
问题可能是因为
client.aclose()
返回了一个awaitable
,这在正常的def
函数中是无法等待的也许值得尝试一下
asyncio.run(self.client.aclose())
。这里可能会出现一个异常,抱怨您使用的是与当前运行的event loop
不同的event loop
(或者相同的,我不太了解您的上下文,所以我无法判断)。在这种情况下,您可以获取当前正在运行的event loop
并从那里运行函数请参阅https://docs.python.org/3/library/asyncio-eventloop.html了解有关如何完成此任务的更多信息
相关问题 更多 >
编程相关推荐