1

基本的に:ソケットに何も配信されていないため、またはネットワーク接続がダウンしているためにソケットがタイムアウトしたことを通知する方法はありますか(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に基づいて理由を区別する方法はありますか?

4

1 に答える 1

2

ここでOP。タイムアウトが発生した理由を区別する方法はまだわかりませんが、 Twitter Streaming Docsで、私が抱えていた根本的な問題を解決するのに役立つ何かを見つけることができました。

屋台

改行を含むデータを受信せずに90秒が経過した場合は、次のセクションのバックオフ戦略に従って、すぐに切断して再接続します。Streaming APIは、アプリケーションが接続をタイムアウトしないように、30秒ごとに改行を送信します。

したがって、基本的に、タイムアウトを30秒よりも長い時間に設定すると(Twitterでは90を推奨)、30秒ごとに「ハートビート」を送信して、ストリーミング接続がまだ有効であることをクライアントに保証するため、解決できます。その後、実際にタイムアウトが発生した場合はいつでも、再接続プロセスを安全に開始できます。

SSLErrors内に何らかの違いがあるかどうかを知りたいのですが、誰かが同じ問題を経験している場合に備えて、これが役立つと思いました。

于 2012-09-26T20:21:21.823 に答える