基本的に:ソケットに何も配信されていないため、またはネットワーク接続がダウンしているためにソケットがタイムアウトしたことを通知する方法はありますか(Python 2.7)?
長期間(> 30日)TwitterStreamingAPIに接続するPythonアプリケーションがあります。アプリは、ツイートが配信されるたびにソケットのバッファーから読み取りますが、ツイートが配信されない場合、readコマンドはタイムアウトして。をスローしSSLError
ます。
読み取り/タイムアウトが発生するスニペットは次のとおりです。
try:
d = resp.read(1)
return d
except SSLError as e:
# the read timed out, nothing was read
return None
except Exception as e:
log.error('Error reading from stream : {0}'.format(e))
作成時にタイムアウトを設定しましたがHTTPSConnection
、現在は30秒に設定されています。したがって、ツイートが30秒間読み取られない場合、resp.read
コマンドはタイムアウトしてSSLErrorをスローするので、無視し(Noneを返すことで、これはこのスニペットから1レベル上で処理されます)、さらに30秒間再度読み取ります。問題は、ネットワークが切断された場合、すぐに再接続されたとしても、ソケットが再び読み取りを開始するようには見えず、タイムアウトし続けることです。これを解決する唯一の方法は、再接続することです。これは、ネットワークの切断がまれであるため、問題ありません。タイムアウトを非常に高く設定し、タイムアウトごとに再接続することもできますが、誰かがネットワークケーブルを引っ張ったという理由だけで、アプリケーションが機能しない時間が長くなります。ダウンタイムを最小限に抑えるためにタイムアウトを低く設定することもできますが、ツイートが読み取られないときに不必要に再接続しています。
スローされたSSLErrorに基づいて理由を区別する方法はありますか?