HN 日本語サマリー

← 一覧へ戻る
プログラミング

Backon – Pythonのリトライ(依存関係ゼロ、サーキットブレーカー、ネイティブ非同期対応)

Backon – Python retry (zero deps, circuit breaker, async native) (github.com)

9 pointsby Llucs2 コメント

要約

Backonは、依存関係ゼロでモダンかつ高速なPythonのリトライライブラリです。デコレーター、関数型API、コンテキストマネージャーAPIを提供し、同期および非同期コードの両方に対応しています。指数関数的バックオフ、サーキットブレーカー、ヘッジングなどの高度な機能も備えています。

全文翻訳

Backon 関数デコレーターによるバックオフとリトライ — モダン、高速、依存関係ゼロ。 Backonは、バックオフのためのモダンな進化形であり、指数関数的バックオフによるリトライのための依存関係ゼロのPythonライブラリです。同期コードと非同期コードの両方に対して、デコレーター、関数型、コンテキストマネージャーのAPIを提供します。 目次 機能 インストール クイックスタート APIリファレンス デコレーター 関数型API コンテキストマネージャー 呼び出し側 待機ジェネレーター 停止条件 リトライ条件 ジッター ハンドラー グローバルトグル 非同期サポート カスタムスリープ 高度な機能 サーキットブレーカー ヘッジング メトリクス テストユーティリティ Trioサポート リトライコンテキストの検査 動的なバックオフ ホットループ検出 リトライ統計 演算子の合成 イテレーターAPI backoffからの移行 コントリビューション ライセンス 機能 依存関係ゼロ — 純粋なPython、標準ライブラリのみ 4つのAPI — デコレーター(@on_exception、@on_predicate)、関数型(retry())、コンテキストマネージャー(Retrying)、呼び出し可能(RetryingCaller / AsyncRetryingCaller) 非同期ネイティブ — 同じAPIがasync def関数でも動作します 完全な型ヒント — mypyで検証済み、strictモード互換 グローバルトグル — テスト用にbackon.disable() / backon.enable() を使用 カスタムスリープ — 独自のsleep関数を注入(asyncio.Eventを使用したテストに便利) 複数の待機戦略 — 指数関数的、定数、フィボナッチ、減衰、実行時、ランダム化、増分、および合成チェーン ジッター — フルジッター、ランダムジッター、またはなし 豊富なコールバック — on_attempt、on_backoff、on_success、on_giveup、before_sleep、before、after サーキットブレーカー — CLOSED/OPEN/HALF_OPEN状態と自動復旧 ヘッジング — 同時リトライリクエスト、最初に成功したものが勝ち Prometheus / OpenTelemetryメトリクス — オプション、ハード依存関係なし テストモジュール — disable_retries()、limit_retries()、remove_backoff()、assert_retried() Trioサポート — trio非同期フレームワークでのリトライ 演算子のオーバーロード — | / & で停止条件を合成、+ で待機ジェネレーターを合成 イテレーターAPI — attempt in Retrying(...) のように使用 モダンなパッケージング — PEP 621、PDM、py.typed インストール pip install backon Python 3.10+ が必要です。 クイックスタート 例外でリトライ import backon @backon.on_exception(backon.expo, ValueError, max_tries=3) def fetch_data(): return api.call() 述語でリトライ @backon.on_predicate(backon.constant, max_tries=5, interval=0.5) def poll_status(): return check_ready() 関数型API result = backon.retry( fetch_data, backon.expo, exception=ValueError, max_tries=3, ) コンテキストマネージャー with backon.Retrying(backon.expo, exception=ValueError, max_tries=3) as r: result = r.call(fetch_data) 非同期バリアント: async with backon.Retrying(backon.constant, exception=ValueError, max_tries=3, interval=0.5) as r: result = await r.async_call(fetch_data) APIリファレンス デコレーター @backon.on_exception(wait_gen, exception, ...) 指定された例外のいずれかをデコレートされた関数が発生させた場合にリトライします。 @backon.on_exception(backon.expo, (ValueError, TimeoutError), max_tries=5) def fetch(): ... 引数 タイプ デフォルト 説明 wait_gen WaitGenerator — 待機戦略(expo、constant、fiboなど) exception type または tuple[type] — リトライする例外クラス max_tries int または Callable[[], int] None 最大試行回数 max_time float、timedelta、または Callable None 最大総経過時間 jitter Jitterer または None — フルジッター Jitterer または None — ランダムジッター関数 giveup Callable[[Exception], bool or float] lambda e: False 一致する例外のリトライを停止します。floatを返すと待機時間を上書きします。 on_success Handler または list None 成功した試行の後に呼び出されます。 on_backoff Handler または list None 各リトライの前に呼び出されます。 on_giveup Handler または list None リトライが尽きたときに呼び出されます。 on_attempt Handler または list None 各試行の前に呼び出されます。 before_sleep Handler または list None スリープの前に呼び出されます。 before Handler または list None 各試行の前に呼び出されます(on_attemptより低レベル)。 after Handler または list None 各試行の後に呼び出されます(on_success/on_giveupより低レベル)。 retry_error_callback Callable[[dict], Any] None リトライが諦めたときに呼び出されます。 raise_on_giveup bool True 諦めたときに最終的な例外を発生させます。 logger str または Logger "backon" Logger名またはインスタンス backoff_log_level int logging.INFO バックオフメッセージのログレベル giveup_log_level int logging.ERROR ギブアップメッセージのログレベル sleep Callable[[float], Any] None カスタムスリープ関数 **wait_gen_kwargs 変動 — 待機ジェネレーターに渡される追加のキーワード引数(例: base=3, interval=0.5) @backon.on_predicate(wait_gen, predicate, ...) 述語が戻り値と一致する場合にリトライします。 @backon.on_predicate(backon.constant, predicate=lambda x: x is None, max_tries=5) def poll(): ... on_exceptionのすべてのパラメータに加えて、on_predicateの追加パラメータを受け入れます。 引数 タイプ デフォルト 説明 predicate Callable[[Any], bool] operator.not_ 戻り値に対してこれがTrueを返す場合にリトライします。 関数型API backon.retry(target, wait_gen, ...) result = backon.retry( target=my_function, wait_gen=backon.expo, exception=ValueError, max_tries=3, ) on_exceptionのすべてのパラメータに加えて、on_predicateの追加パラメータを受け入れます。 引数 タイプ デフォルト 説明 condition RetryCondition None 高度なリトライ条件オブジェクト stop Stop None 高度な停止条件オブジェクト name str "" リトライ呼び出しの識別子 **wait_gen_kwargs 変動 — 待機ジェネレーターに渡される追加のキーワード引数 ターゲットがコルーチン関数である場合、retry()はコルーチンを返します。それ以外の場合は同期的に結果を返します。 コンテキストマネージャー backon.Retrying(wait_gen, ...) with backon.Retrying(backon.expo, exception=ValueError, max_tries=3) as r: r.call(my_function) async with backon.Retrying(backon.constant, exception=ValueError, max_tries=3, interval=0.5) as r: await r.async_call(my_async_function) メソッド 説明 call(target, *args, **kwargs) 同期的に実行します。 async_call(target, *args, **kwargs) 非同期的に実行します。 copy() Retryingインスタンスの変更されたコピーを返します。 statistics プロパティ。attempt_number、elapsed、idle_for、start_timeを含む辞書を返します。 call_state プロパティ。現在のRetryCallStateを返します。 enabled プロパティ。インスタンスごとにリトライを有効/無効にするためのものです。 引数: retry()と同じですが、enabled(デフォルトTrue)が追加されます。 呼び出し側 backon.RetryingCaller(wait_gen, ...) .on() を介して事前にバインドされた例外タイプを持つ呼び出し可能なオブジェクトです。 caller = backon.RetryingCaller(backon.expo, max_tries=3) caller = caller.on(ValueError) result = caller(my_function, arg1, arg2) backon.AsyncRetryingCaller(wait_gen, ...) RetryingCallerの非同期バリアントです。 caller = backon.AsyncRetryingCaller(backon.expo, max_tries=3).on(ValueError) result = await caller(my_async_function, arg1, arg2) メソッド 説明 .on(exception) 指定された例外タイプにバインドされたコピーを返します。 .copy() 変更されたコピーを返します。 .__call__(target, *args, **kwargs) リトライして実行します。 待機ジェネレーター すべての待機ジェネレーターは、一連の待機時間を生成する呼び出し可能です。追加のキーワード引数(例: interval=0.5、base=3)をデコレーターや関数に **wait_gen_kwargs として渡します。 ジェネレーターシグネチャ 説明 expo (base=2, factor=1, max_value=None) 指数関数的バックオフ: factor * base^n constant (interval=1) 固定間隔。floatまたはSequence[float](変動間隔用)を受け入れます。 fibo (max_value=None) フィボナッチ数列: 1, 1, 2, 3, 5, 8, ... runtime (value=Callable) 戻り値または例外からの動的な待機 — Retry-Afterヘッダーに便利です。 decay (initial_value=1, decay_factor=1, min_value=None) 指数関数的減衰: initial * e^(-t * decay_factor) wait_random_exponential (multiplier=1, max_value=None, exp_base=2, min_value=0) 指数関数値の間の均一なランダム値を持つランダム指数関数。 wait_incrementing (start=1, increment=1, max_value=None) 線形増分: start + n * increment wait_chain (*generators) 複数のジェネレーターを順番に再生します。 wait_exception (value=Callable) キャッチされた例外に基づく動的な待機。 wait_random (min=0, max=1) minとmaxの間の均一なランダム待機。 wait_exponential_jitter (initial=1, max=60, exp_base=2, jitter=1) ランダムジッターが追加された指数関数的バックオフ。 wait_none () 常に0を返します(待機なし)。 合成: 待機ジェネレーターを組み合わせます。