3

私は最近Pythonプロジェクトを継承し、現在それを維持するために取り組んでいます。コードの一部は、Webサイトから数十万の要求を行い、その結果をデータベースに保存します。コードは、リーチ要求に同じhttplib.HTTPConnectionオブジェクトを再利用してから、ループします。

conn.request("GET",someString,'',headers)

response = conn.getresponse()

セクション。数日前、私のログで、リクエストの1つが例外をスローしたことがわかりました。

[Errno 104] Connection reset by peer  

その後、他のすべてのconn.request()が失敗します。私の最初の傾向は、リクエストごとに新しい接続を構築することでしたが、そのパフォーマンスへの影響は深刻で恐ろしいものでした。だから私の質問は、これをどのように修正するかです。特に、これを実際にテストする方法が100%わからないためです。

例外の後にconn.connect()を呼び出すだけで、正しく再接続されますか?

私はそれを修正する方法とおそらくそれをテストする方法についてのアドバイスを探しています。

御時間ありがとうございます。

4

1 に答える 1

3

まず、処理したい故障モードを決める必要があると思います。たとえば、サーバーの一時的なリソースの問題が原因で接続がリセットされ、迅速なターンアラウンド接続で修正されましたか?または、サーバーがダウンしているか再起動しているので、プロセスを中止する必要がありますか?

最初のケースを想定すると、あなたは正しい方向に向かって考えていると思います。次のようなものを試してください(これは機能するコードではありません-これはロジックの単なる例です):

while True:
    try:
        conn.request("GET",someString,'',headers)
        response = conn.getresponse()
    except httplib.HTTPException, e:
        conn.connect()
        continue
    break

おそらく、接続の繰り返し試行の間に一時停止し、特定の試行回数の後にあきらめるために、ロジックを追加する必要があります(これは基本的に上記の2番目のシナリオです)。

これをテストするには、tcpkillを使用してTCP接続をリセットしてみてください。

http://www.gnutoolbox.com/tcpkill-command/

于 2012-11-30T21:07:34.917 に答える