2016-08-03 4 views
2

私たちはPython3.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 

それは、大丈夫だと思います正常に機能します。私たちのケースでは、このエラーにより、post要求が実行されたasyncioタスク全体がフリーズすることになります。

エラーの発生をhttps://github.com/python/asyncio/blob/master/asyncio/selector_events.py#L674に追跡し、その後call_exception_handlerを呼び出しました。

この例外によって_https_sessionが無効/使用不可になる可能性があります。新しいものを作成する必要がありますか?それとも何かできることはありますか?

答えて

1

TimeoutErrorは、1つの接続をClientSessionから閉じる必要があります。セッション自体は引き続き機能します。

おそらく、あなたのコードで例外をキャッチする必要があります。

申し訳ありませんが、ソースコードを見ずにさらに書き込むことはできません。

P.S. 応答寿命を制御するためにasync withステートメントを使用しないのはなぜですか?

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

同様

うん、この場合には使用すべきであるとの非同期(async)、それを変更します。完全なコードはhttps://repl.it/CjABにあります。そしてエラーは実際にはちょうどいいはずです私たちのexcept句によって実際にキャッチされています.. – Jendas

+0

あなたはaioesの存在を知っていますか? –