Python频繁要求问题:[Errno 104]Connection reset by peer

1606 ワード

Table of Contents
  • 1. [Errno 104]Connection reset by peer
  • [Errno 104]Connection reset by peer
    今日の仕事では、データベースに3万件近くのurl記録があり、各記録は1つの画像であり、各画像をローカルに保存するように要求する必要があります.最初はこう書きました(偽コード):
    import requests
    
    for url in urls:
        try:
            r = requests.get(url).content
            save_image(r)
        except Exception, e:
            print str(e)

    しかし、サーバ上で実行すると、いくつかのリクエストごとに次のようなエラーが表示されます.
    HTTPConnectionPool(host='wx.qlogo.cn', port=80): Max retries exceeded with url: /mmopen/aTVWntpJLCAr2pichIUx8XMevb3SEbktTuLkxJLHWVTwGfkprKZ7rkEYDrKRr5icyDGIvU4iasoyRrqsffbe3UUQXT5EfMEbYKg/0 (Caused by : [Errno 104] Connection reset by peer)

    これは以前hacker news apiで自分のパソコンで1つのデータを要求したとき、処理速度を速めるためにマルチプロセスでインタフェースを要求したときにも、このようなエラーが発生したことを思い出します.以前はエラー記録を直接passしていましたが、今回はすべての画像を要求する必要があるため、googleで関連原因を調べました.多分、私が頻繁に要求したため、サーバーが部門要求接続を閉じたからです.ここ、ここ、ここを参照してください.だから私は乱暴にこのようにして、本当に解決しました:
    import requests
    
    for url in urls:
        for i in range(10):
            try:
                r = requests.get(url).content
            except Exception, e:
                if i >= 9:
                    do_some_log()
                else:
                    time.sleep(0.5)
            else:
                time.sleep(0.1)
                break
    
         save_image(r)

    コードは粗末ですが、大体の解決策を説明することができます.各リクエスト間に遅延を増やすと、ほとんどのリクエストが拒否されるのを減らすことができますが、いくつかのリクエストが拒否されることがあります.そのため、そのリクエストが拒否された後、再試行を開始し、10回拒否された後にやっとやめます(ログに記録されます).実際のリクエストでは,0.1 sの遅延を加えて拒否されることは明らかに少なく,再試行を拒否される回数は最大3回となり,最後にすべてのピクチャを取り外すことに成功した.
    転載先:https://www.cnblogs.com/nisen/p/6063638.html