Pythonエラー再試行:retrying

3903 ワード

Pythonコードを作成して自動化テスト、ネットワーク爬虫類、またはネットワークに関連する他の動作を行う場合、ネットワークの影響で失敗しやすくなりますが、このような失敗は私たちが処理する必要はありません.この場合、ネットワークの断続的な影響を避けるために、失敗した後に何度も再試行するのが最善の方法です.
コードを正常に作成するには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()