3

我们使用 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无效/不可用,我们需要创建一个新的?或者我们还有什么可以做的吗?

4

1 回答 1

1

TimeoutError应该从 关闭一个连接ClientSession。会话本身继续工作。

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

对不起,不看源代码就写不下去了。

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

喜欢

async with self._http_session.request(method, url,
        data = data_fun(), params = params) as response:
    ...
于 2016-08-03T10:54:36.073 回答