1はじめに
プログラム、特にWebインターフェイスの呼び出し、Webクローラーの実行などのネットワーク要求に関連するプログラムを作成する場合、要求が失敗することがよくあります。現時点では、エラーをキャッチしてジャンプするだけでは、厳密ではありません。特にWebクローラーで対応するタスクを渡すと、貴重なデータが失われるリスクがあります。
そのような場合は、プログラムロジックに「エラーリトライ」Python
戦略を追加する必要があります。数年前にライブラリを紹介する記事を書いたフェイさんですretry
が、その機能は比較的シンプルで、基本的な機能を処理します。需要。
そして、今日紹介したいtenacity
ライブラリは、現在のエコシステムで最高のエラー再試行ライブラリかもしれませんPython
。その主な機能を見てみましょう〜
2粘り強さの一般的な機能
サードパーティのPython
ライブラリとして、それを使用してインストールできます。インストールが完了したら、主な使用方法と機能をpip install tenacity
学びましょう。tenacity
2.1粘り強さの基本的な使い方
tenacity
エラー再試行のコア機能はretry
、そのデコレータによって実装されます。retry
デフォルトでデコレータにパラメータが渡されない場合、次の簡単な例のように、装飾された関数の操作中にエラーがスローされたときに再試行を続けます。
import random
from tenacity import retry
@retry
def demo_func1():
a = random.random()
print(a)
if a >= 0.1:
raise Exception
demo_func1()
関数本体で毎回0から1までの乱数が生成されていることがわかります。乱数が0.1を超えない場合、エラーのスローを停止します。それ以外の場合tenacity
は、エラースロー動作がスローされるたびにキャッチされます。すぐに再試行してください。
2.2最大再試行回数を設定する
特定の関数ロジックエラーを再試行する許容範囲が制限される場合があります。たとえば、特定のネットワークインターフェイスを呼び出したときに、実行がn回連続して失敗した場合、再試行ではなく、タスク自体に欠陥があると見なされることがあります。いつかは正常になります。
この時点で、のパラメータとして渡されtenacity
たの関数を利用して、「最大再試行回数」として整数入力を受け入れる「エンドレス」エラー再試行プロセスにエンドポイントを追加できます。stop_after_attempt
retry()
stop
stop_after_attempt()
from tenacity import retry, stop_after_attempt
@retry(stop=stop_after_attempt(3))
def demo_func2():
print('函数执行')
raise Exception
demo_func2()
再試行の最大回数を制限した後、関数は3回再試行し、4回目の実行でもエラーがスローされた後Exception
、関数の対応するエラーが正式にスローされて再試行プロセスが終了していることがわかります。
2.3最大再試行タイムアウト期間を設定します
前のセクションのようにエラー再試行の最大数を設定することに加えて、再試行プロセス全体に費やされる最大時間を設定tenacity
する機能も提供します。これを超えると、再試行プロセスは終了します。stop_after_delay()
import time
from tenacity import retry, stop_after_delay
# 设置重试最大超时时长为5秒
@retry(stop=stop_after_delay(5))
def demo_func3():
time.sleep(1)
print(f'已过去 {time.time() - start_time} 秒')
raise Exception
# 记录开始时间
start_time = time.time()
demo_func3()
2.4複合再試行停止条件
タスクで最大再試行回数と最大タイムアウト期間を同時に追加する必要がある場合は、演算子tenacity
を使用|
してさまざまな制約を組み合わせてからパラメーターを渡すだけretry()
でstop
済みます。たとえば、次の例では、関数が実行されるときに3秒以上または5回以上再試行を終了できます。
import time
import random
from tenacity import retry, stop_after_delay, stop_after_attempt
@retry(stop=(stop_after_delay(3) | stop_after_attempt(5)))
def demo_func4():
time.sleep(random.random())
print(f'已过去 {time.time() - start_time} 秒')
raise Exception
# 记录开始时间
start_time = time.time()
demo_func4()
上記のデモでは、最初に「最大5回の再試行」の制限に達して、再試行プロセスが終了していることがわかります。
2.5隣接する再試行間の時間間隔を設定します
場合によっては、各再試行がエラーをスローした直後に次の再試行を開始したくないことがあります。たとえば、クローラータスクでプログラムをより適切に偽装するためにtenacity
、一連の非常に実用的な関数が一致するretry()
パラメーターで提供されますwait
。隣接する再試行間の時間間隔を適切に処理するのに役立ちます。その中で、より実用的なのは主に次の2つの方法です。
2.5.1固定時間間隔の設定
tenacity
次の簡単な例のように、wait_fixed()
を使用して、隣接する再試行の間に待機する固定秒数を設定できます。
import time
from tenacity import retry, wait_fixed, stop_after_attempt
# 设置重试等待间隔为1秒
@retry(wait=wait_fixed(1), stop=stop_after_attempt(3))
def demo_func5():
print(f'已过去 {time.time() - start_time} 秒')
raise Exception
# 记录开始时间
start_time = time.time()
demo_func5()
2.5.2ランダムな時間間隔を設定する
固定の時間間隔を設定することに加えて、隣接する再試行に対して均一に分散された乱数を設定するのにtenacity
も役立ちます。均一に分散された範囲を設定するだけです。wait_random()
import time
from tenacity import retry, wait_random, stop_after_attempt
# 设置重试等待间隔为1到3之间的随机数
@retry(wait=wait_random(min=1, max=3), stop=stop_after_attempt(5))
def demo_func6():
print(f'已过去 {time.time() - start_time} 秒')
raise Exception
# 记录开始时间
start_time = time.time()
demo_func6()
各再試行後の待機時間はランダムであることがわかります〜
2.6再試行をトリガーするかどうかをカスタマイズする
tenacity
のretry()
デフォルトの戦略は、それが装飾する関数の実行が「エラーをスローする」ときに再試行することですが、場合によっては、特定のタイプのエラーをキャッチ/無視するか、例外キャプチャの結果を計算する必要があります。
tenacity
また、組み込みの関連する便利な関数:
2.6.1特定のエラータイプをキャッチまたは無視する
tenacity
in-retry_if_exception_type()
およびretry_if_not_exception_type()
--matchパラメータを使用して、特定retry()
のエラータイプをキャッチまたは無視できます。retry
from tenacity import retry, retry_if_exception_type, retry_if_not_exception_type
@retry(retry=retry_if_exception_type(FileExistsError))
def demo_func7():
raise TimeoutError
@retry(retry=retry_if_not_exception_type(FileNotFoundError))
def demo_func8():
raise FileNotFoundError
2.6.2ユーザー定義関数結果条件判定関数
追加の条件付き判定関数を作成できます。協力してtenacity
、retry_if_result()
関数の戻り結果にカスタム条件付き判定を実装できます。True
再試行操作は、次の値が返されたときにのみトリガーされます。
import random
from tenacity import retry, retry_if_result
@retry(retry=retry_if_result(lambda x: x >= 0.1))
def demo_func9():
a = random.random()
print(a)
return a
# 记录开始时间
demo_func9()
2.7関数のエラー再試行をカウントします
装飾された関数の場合、そのプロパティを印刷しtenacity
て統計を表示し、過去のエラーの結果を記録して再試行できます。たとえば、ここでは、以前に実行されたサンプル関数の統計を印刷します。retry()
retry.statistics
demo_func9()
demo_func9.retry.statistics
上記の機能に加えて、モジュール、非同期機能、コルーチンなどの他の機能tenacity
と組み合わせて、より高度な機能を実現できる多くの特別な機能もあります。興味のある友人は、詳細を知ることができます。logging
Python
https://github.com/jd/tenacity
Python学習
Python学習パートナー、新しい交換に参加することを歓迎します[Jun Yang]:1020465983
プログラミングの知識について話し合い、神になり、ソフトウェアインストールパッケージ、実践的な事例、学習教材がグループにあります