首页 文章

aiohttp - 套接字传输上的致命读取错误 - TimeoutError

提问于
浏览
2

我们使用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

如果它只是引发异常并继续正常运行,那就没问题了 . 在我们的例子中,似乎这个错误导致整个asyncio任务,其中执行post请求,以冻结 .

我们将错误提升跟踪到https://github.com/python/asyncio/blob/master/asyncio/selector_events.py#L674,随后调用 call_exception_handler .

这个异常是否有可能使 _https_session 无效/无法使用,我们需要创建一个新的?或者我们还能做些什么吗?

1 回答

  • 1

    TimeoutError 应该从 ClientSession 关闭一个连接 . 会话本身继续发挥作用 .

    也许您应该在代码中捕获异常 .

    抱歉,如果不查看源代码,就无法写更多内容 .

    附:为什么不使用 async with 语句来控制响应生命周期?

    喜欢

    async with self._http_session.request(method, url,
            data = data_fun(), params = params) as response:
        ...
    

相关问题