Pythonエラー再試行:retrying
3903 ワード
Pythonコードを作成して自動化テスト、ネットワーク爬虫類、またはネットワークに関連する他の動作を行う場合、ネットワークの影響で失敗しやすくなりますが、このような失敗は私たちが処理する必要はありません.この場合、ネットワークの断続的な影響を避けるために、失敗した後に何度も再試行するのが最善の方法です.
コードを正常に作成するにはtryが必要かもしれませんExceptですが、この書き方は面倒で、実現できる効果も単一です.ここでは、異常を放出する関数または方法を再試行するためのPythonライブラリエラーが発生した後、正常に動作するまで関数を再実行します. エラーが発生した後、しばらく停止してから関数を実行します.ネットワークが一時的によくなる可能性があるからです. エラー後、再試行時間が長すぎると、コード効率が低下し、最大の再試行時間を設定できます. エラーが発生した場合、可能なエラーを排除するために別の関数を実行したい場合があります.
では、次に使い方を見てみましょう.まず、このライブラリをインストールする必要があります.
簡単な使い方
簡単な例では、変数aを1から2までランダムに1つ取り、aが1の場合は異常を投げ出し、異常を投げ出した場合に再試行するかどうかを試します.
この関数は50%の確率でエラーを投げ出すので、先に試してみてください.でも運が良ければ...
では、retryingを追加します.
何度か実行してみますが、aが1の場合、aが2になるまで印刷しますか?すなわち、
その他のパラメータ
デフォルトの再試行に満足していないかもしれませんが、より多くの関数を見てみましょう.
再試行回数
最大再試行回数を設定し、それを超えると再試行を停止し、異常を投げ出す.あなたの必要に応じて設定しましょう.普通はあまり多くしないでください.あるいは設定しないで、デフォルトは5回ですが、前提の時に次のバグを修復しました.
3回運転してもエラーが報告された後、3回目の運転の異常が投げ出されたことがわかります.
ここでソースコードにバグがあり、このパラメータを設定しないと無限に再試行されます(異常が中止されない場合はデッドサイクルです).このバグを修正します.
じかんかんけい
関数が異常を放出すると、次の再試行は
wait_random_minとwait_random_maxを組み合わせてデフォルトのランダム待ち時間を設定し、デフォルトは0~1000ミリ秒のランダム待ち時間です.
これは再試行間隔時間ではなく、関数実行+再試行終了の全体時間です.例えば、
関連関数の再試行
コードを正常に作成するにはtryが必要かもしれませんExceptですが、この書き方は面倒で、実現できる効果も単一です.ここでは、異常を放出する関数または方法を再試行するためのPythonライブラリ
retrying
を紹介する.retrying
を通じて何ができますか.では、次に使い方を見てみましょう.まず、このライブラリをインストールする必要があります.
pip install retrying
簡単な使い方
簡単な例では、変数aを1から2までランダムに1つ取り、aが1の場合は異常を投げ出し、異常を投げ出した場合に再試行するかどうかを試します.
import random
def demo():
a = random.randint(1,2)
print(a) # => ,
if a == 1:
raise # 1
この関数は50%の確率でエラーを投げ出すので、先に試してみてください.でも運が良ければ...
では、retryingを追加します.
from retrying import retry # => retry
import random
@retry() # => ,
def demo():
a = random.randint(1,2)
print(a) # => ,
if a == 1:
raise # 1
demo() # =>
何度か実行してみますが、aが1の場合、aが2になるまで印刷しますか?すなわち、
@rery()
が異常を処理し、再試行したことを意味する.その他のパラメータ
デフォルトの再試行に満足していないかもしれませんが、より多くの関数を見てみましょう.
再試行回数
stop_max_attempt_number
最大再試行回数、デフォルトは5回最大再試行回数を設定し、それを超えると再試行を停止し、異常を投げ出す.あなたの必要に応じて設定しましょう.普通はあまり多くしないでください.あるいは設定しないで、デフォルトは5回ですが、前提の時に次のバグを修復しました.
import random
from retrying import retry
@retry(stop_max_attempt_number=3)
def demo():
a = random.randint(1,2)
print(a, end=" ") # ,
if a != 3: # => , 3
raise
demo()
## 1 1 1
## RuntimeError: No active exception to reraise
3回運転してもエラーが報告された後、3回目の運転の異常が投げ出されたことがわかります.
ここでソースコードにバグがあり、このパラメータを設定しないと無限に再試行されます(異常が中止されない場合はデッドサイクルです).このバグを修正します.
Python \Lib\site-packages\retrying.py
を開き、87
行目を見つけます.if stop_max_attempt_number is not None:
#
if self._stop_max_attempt_number is not None:
じかんかんけい
wait_fixed
再試行の間隔関数が異常を放出すると、次の再試行は
wait_fixed
に設定された時間間隔で行われます.デフォルトは1000ミリ秒(1秒)で、このパラメータでこのデフォルト値を変更できます.wait_random_min
およびwait_random_max
は、ランダムな間隔を設定するために使用されるwait_random_minとwait_random_maxを組み合わせてデフォルトのランダム待ち時間を設定し、デフォルトは0~1000ミリ秒のランダム待ち時間です.
wait_incrementing_increment
再試行ごとに、待機時間を増加し続けるデフォルトは100ミリ秒で、再試行ごとに待機時間が100ミリ秒増加することがあります.stop_max_delay
最長再試行遅延時間(ミリ秒単位)これは再試行間隔時間ではなく、関数実行+再試行終了の全体時間です.例えば、
stop_max_delay=2000
、すなわち、この関数が実行されてから再試行が終了するまでの時間は2000ミリ秒であり、それを超えると再試行が終了し、異常が放出される.関数の実行時間がstopを超えた場合max_delay時間は、再試行されません.import time
import random
from retrying import retry
@retry(stop_max_delay=2000) # =>
def demo():
a = random.randint(1, 2)
print(a, end=" ")
time.sleep(1) # => 1
if a != 3:
raise
demo()
## 1 2
## RuntimeError: No active exception to reraise
関連関数の再試行
retry_on_result
:関数を指定し、指定した関数がTrueを返すと、再試行します.そうしないと、例外を投げ出して終了します.import random
from retrying import retry
def fun():
#
return True # => True
@retry(retry_on_result=fun) # , fun True ,
def demo():
a = random.randint(1, 2)
print(a, end=" ")
if a != 3:
raise
demo()
shop_func
:被装飾関数のエラーが発生した後に実行される関数を指定し、この関数を実行した後に被装飾の関数を再試行します.この関数には2つのパラメータ(attempts,delay)が必要であることに注意してください.異常を投げ出した後、いくつかの処理が必要な場合に使用します.a = random.randint(1, 2)
def fun(attempts, delay):
global a
a = 3
print(' ')
@retry(stop_func=fun)
def demo():
print(a, end=" ")
time.sleep(1)
if a != 3:
raise
demo()