我的代码遇到了一些问题。我有一个aiohttp客户会话,该会话通过请求与网站进行通信。
问题是,当我长时间运行代码时,我开始遇到诸如ClientResponseError
,ServerDisconnectedError
,Error 101
之类的错误。所以我在阅读文档,然后看到了:
release()
将连接释放回连接器。
底层插座 未关闭,如果超时可能在以后重用连接 (默认为30秒)连接未过期。
但是我不明白。有人可以简单地解释一下吗?它可以解决我的问题吗?
session = aiohttp.ClientSession(cookie_jar=cookiejar)
while True:
await session.post('https://anywhere.com', data={'{}': ''})
答案 0 :(得分:1)
当您连接的服务器过早关闭连接时,会引发异常。它发生了。但是,这不能解决释放到池的连接问题,并且您发布的已经代码可以释放该连接,尽管是隐式的。取而代之的是,您需要处理异常,这是您的应用程序需要决定如何处理此错误。
您可能希望将响应对象用作上下文管理器,当您不再需要访问响应数据时,这将有助于更早地释放连接。您的示例代码未使用session.post()
协程的返回值,因此当Python将其从内存中删除时(如果没有引用留给它),该连接已为您自动释放。作为上下文管理器,通过显式让Python知道您不再需要它。
这是使用(异步)上下文管理器的简单版本,它捕获服务器断开连接时引发的异常,以及更多:
with aiohttp.ClientSession(cookie_jar=cookiejar) as session:
while True:
try:
async with session.post('https://anywhere.com', data={'{}': ''}) as response:
# do something with the response if needed
# here, the async with context for the response ends, and the response is
# released.
except aiohttp.ClientConnectionError:
# something went wrong with the exception, decide on what to do next
print("Oops, the connection was dropped before we finished")
except aiohttp.ClientError:
# something went wrong in general. Not a connection error, that was handled
# above.
print("Oops, something else went wrong with the request")
我选择捕获ClientConnectionError
,这是ServerDisconnectedError
派生的基类,但是捕获此异常使您可以使用相同的异常处理程序处理更多的连接错误情况。请参见exception hierarchy,以帮助您决定要捕获哪些异常,这取决于您需要多少细节。