2016-08-03 29 views
2

我们使用aiohttp和Python3.5将数据发布到弹性搜索中。后线如下:aiohttp - 套接字传输上的致命读取错误 - TimeoutError

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 

这将是罚款,如果它只是引发异常,并继续功能正常。在我们的例子中,似乎这个错误会导致整个异步任务在执行后发送请求时冻结。

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

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

回答

1

TimeoutError应关闭ClientSession的一个连接。会议本身继续工作。

也许你应该在你的代码中发现异常。

对不起,如果不查看源代码,就不能再写更多。

P.S. 为什么您不使用async with语句来控制响应生命周期?

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

呀,异步与应在这种情况下使用,将改变这种状况。完整的代码可以在这里找到 - https://repl.it/CjAB。而这个错误实际上是由我们的除外条款所捕获的,应该很好.. – Jendas

+0

顺便提一下,你知道aioes的存在吗? –