我们使用aiohttp和Python3.5将数据发布到弹性搜索中。邮政行如下:
response = await self._http_session.request(method, url,
data = data_fun(), params = params)
通常一切都运行得很好,但有时会出现以下错误:
Fatal read error on socket transport
protocol: <aiohttp.parsers.StreamProtocol object at 0x7fde5eb7eeb8>
transport: <_SelectorSocketTransport fd=21 read=polling write=<polling, bufsize=261832>>
Traceback (most recent call last):
File "/usr/lib/python3.5/asyncio/selector_events.py", line 664, in _read_ready
data = self._sock.recv(self.max_size)
TimeoutError: [Errno 110] Connection timed out
如果它只是引发异常并继续正常运行,那就没问题了。在我们的例子中,似乎这个错误会导致执行post请求的整个asyncio任务冻结。
我们将错误加注追踪到https://github.com/python/asyncio/blob/master/asyncio/selector_events.py#L674,随后调用call_exception_handler
。
此异常是否可能导致_https_session
无效/无法使用,我们需要创建新的?或者我们还能做些什么吗?
答案 0 :(得分:1)
TimeoutError
应关闭ClientSession
之间的一个连接。会话本身继续发挥作用。
也许您应该在代码中捕获异常。
抱歉,如果不查看源代码,就无法写更多内容。
P.S。
为什么不使用async with
语句来控制响应生命周期?
像
async with self._http_session.request(method, url,
data = data_fun(), params = params) as response:
...