python 3 requestsエラーを解決して再テストする問題


python 3のrequestsの使い方はあまり上手ではありません。今日はちょっと使いました。何回か降りたら接続のタイムアウトの異常がありました。インターネットで調べてみたら、まあまあの解決方法が見つかりました。
retryingはpythonが持参した再試験カバンです。
インポート:

from retrying import retry
簡単に使う
retryingというカバンの使い方原理は、そのコードブロックに異常があるかどうかは分かりません。異常が発生したら、再度このセグメントのコードブロックを実行してもいいです。異常が発生していなければ、コードブロックを実行し続けます。
以前あなたのコードはこのように書かれていたかもしれません。

def get_html(url):
 pass
def log_error(url):
 pass
url = ""
try:
 get_page(url)
except:
 log_error(url)
このように書いたかもしれません。

#          
attempts = 0
success = False
while attempts < 10 and not success:
 try:
  get_html(url)
  success = True
 except:
  attempts += 1
  if attempts == 10:
   break
retryingを使う書き方:

import random
from retrying import retry
@retry()
def do_something_unreliable():
 if random.randint(0, 10) > 1:
  raise IOError("Broken sauce, everything is hosed!!!111one")
 else:
  return "Awesome sauce!"
result = do_something_unreliable()
print(result)
上のは簡単な使い方です。試してみてもいいです。下のはオプションのパラメータの使い方です。

stop_max_attempt_number
最大試行回数を設定するには、この回数を超えたらやり直しを停止します。

stop_max_delay
時間を超えると、関数は実行されなくなります。

wait_random_min wait_random_max
ランダムに2回のレイトリング間の滞在時間を生成する。
追加:pythonにおけるRequestsの再試行メカニズム
requests原生サポート

import requests
from requests.adapters import HTTPAdapter
s = requests.Session()
#      3
s.mount('http://', HTTPAdapter(max_retries=3))
s.mount('https://', HTTPAdapter(max_retries=3))
#      5s
s.get('http://example.com', timeout=5)
requestsで使用される再試行アルゴリズム:BackOff(指数バックオフアルゴリズム)
何が指数バックアルゴリズムですか?
wikiでは指数バックオフアルゴリズムを紹介します。
In a variety of computternetworks,binary exponential backoff or truncated binary exponential backoff refers to an algorithm used to space out repeated retrans of the same block of data,off。
さまざまなコンピュータネットワークにおいて、バイナリ指数が後退したり、切り捨てられたバイナリ指数が後退したりして、同じデータブロックから分離して繰り返し伝送するためのアルゴリズムとして使用され、ネットワークの衝突回避の一部としてしばしば用いられる。
例えば、私たちのサービスコール中にコール失敗が発生しました。システムは失敗したリソースを再試行します。この再試行の時間はどのように把握しますか?指数バックオフアルゴリズムを使って、私たちはある範囲でランダムに失敗したリソースに対して再試行を開始できます。失敗の回数が長くなるにつれて、再試行時間も指数の増加に伴って増加します。
もちろん、指数の退避アルゴリズムは上記のように簡単ではありません。具体的に知りたいのは具体的にwikiで紹介できます。
システムの呼び出しが失敗するたびに、私たちは新しいセットを作成します。セットの内容は0~2 n-1で、nは呼び出しが失敗した回数を表します。
最初の失敗セットは0、1
二回目の失敗セットは0、1、2、3です。
3回目の失敗セットは0、1、2、3、4、5、6、7です。
セットの中でランダムに一つの値を選んでRとします。次回の再試行時間はR*基本的なバックオフ時間です。もちろん、システムの無限な再試行を防ぐために、再び最大回数を数えます。
なぜ指数関数バックオフアルゴリズムを使用しますか?
指数のバックオフアルゴリズムを使って、連続的な失敗を防ぐことができます。ある面から言えば、失敗サービスの圧力を軽減することもできます。考えてみてください。もしサービスプロバイダのサービスがある時間に異常が発生したら、タイムアウトやネットワークジッタが頻繁に再試行されても、結果は大体失敗です。このような頻繁な再試行は効果がないばかりか、かえってサービスの負担を増やします。
応用シーンは何がありますか?
サードパーティにアクセスしてサービスを支払い、サードパーティによって提供されるアクセスインターフェース規範において、サービング・プロバイダの取引終了結果通知と取引先のアクティブ・クエリの結果はすべて再送信機構を使用する。
アプリではポーリングのような問題に遭遇する場面が多く、ポーリングはアプリの性能と電力消費に対しても大きすぎる。
コードの例


以上は個人の経験ですので、参考にしていただければと思います。間違いがあったり、完全に考えていないところがあれば、教えてください。