2016-08-03 3 views
2

우리는 탄성 검색에 데이터를 게시하기 위해 Python 3.5와 함께 aiohttp를 사용합니다. 포스트 라인은 다음과 같다 :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 

그것은, 괜찮을 것 정상적으로 기능합니다. 우리의 경우에는이 오류로 인해 게시 요청이 실행되는 전체 asyncio 작업이 중단됩니다.

오류 발생을 https://github.com/python/asyncio/blob/master/asyncio/selector_events.py#L674으로 추적하여 이후에 call_exception_handler을 호출했습니다.

이 예외로 인해 _https_session이 잘못되었거나 사용할 수 없게 될 가능성이 있으며 새 항목을 만들어야합니까? 아니면 우리가 할 수있는 일이 있습니까?

답변

1

TimeoutErrorClientSession에서 하나의 연결을 닫아야합니다. 세션 자체는 계속 작동합니다.

아마도 코드에서 예외를 catch해야합니다.

죄송합니다. 소스 코드를 보지 않고서는 쓸 수 없습니다.

P. 응답 수명을 제어하기 위해 async with 문을 사용하지 않는 이유는 무엇입니까? 이 경우에 사용한다와 비동기

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

네처럼, 그 변경됩니다. 전체 코드는 https://repl.it/CjAB에서 확인할 수 있습니다. 그리고 오류는 실제로 잘해야합니다 우리의 except 절에 의해 잡힌 것입니다 .. – Jendas

+0

BTW 당신은 ​​aioes 존재에 대해 알고 계십니까? –