Python入門Tweetよくプログラムから外部のAPIにリクエストを投げるときに、たまにの接続エラーだったり、Timeoutだったりで、正常なレスポンスが返ってこないことがあります。偶発的なエラーであれば、時間を空けて再試行することで正常な結果が得られることがあります。私も新人のときに、少なくとも外部に通信をするときは、自動リトライの仕組みを設けようと教わりました。3.7.6で検証しています。今回のケース自動リトライの仕組みをループで実装しよう!retryモジュールを使って自動リトライを設定しよう!retryモジュールのキホンbackoffでリトライ間隔を調整するloggerを設定し、リトライ時にログ出力するまとめ今回のケース今回はシンプルな例で、以下のメソッド、call_api()が異常終了したときの自動リトライについて考えてみます。ご覧の通り、常に例外を返すだけのメソッドです。ApiConnectionError('API接続エラー')自動リトライの仕組みをループで実装しよう!for文で試行回数繰り返すようにして、正常時はすぐにループから抜け、異常時は間隔を空けて繰り返し処理するようにしてみます。continue処理時間を計測するため、loggerのフォーマット設定していますが、loggerについては以下の記事でもまとめています。www.true-fly.comそして、実行結果は以下の通りです。リトライが3回、試行回数4回繰り返し、最後に異常終了していることがわかります。ほとんどのプログラミング言語でも応用できると思います。コードが長くなりやすく、書き間違いなどで正しく動作しない可能性もあります。そこで次に試すのが、Pythonのretryモジュールです。retryモジュールを使って自動リトライを設定しよう!retryモジュールのキホンretryモジュールとは、その名の通りretryをいい感じにしてくれる外部ライブラリです。PYPIには、このretryモジュールのほか、retryingやTenacityといった外部ライブラリもあります。いずれもやりたいことは実現できそうなので、今回はこのretryモジュールで検証してみます。ライブラリのインストールから行います。retry==0.9.2以下がretryモジュールを用いたサンプルコードです。delay=2)のように、メソッドにデコレータを追加することで設定ができます。retryデコレータのパラメータはそれぞれ以下を指定します。先程のfor文で実装したときと同等の設定にしています。実行結果は以下の通りです。スタックトレースで、retryモジュールを通ってエラーが発生していることがわかるようになっていますね。API接続エラーbackoffでリトライ間隔を調整する先程は指定した一定のリトライ間隔で試行していましたが、リトライ1回目、2回目、3回目と連れるに、間隔を広げていきたいケースもあります。その時は、retryデコレータのbackoffパラメータを指定することで、指数関数的に間隔を広げることができます。ApiConnectionError('API接続エラー')実行結果は以下の通りです。API接続エラーリトライ間隔を指数関数的な曲線が描かれました。ような式になっていると思われます。loggerを設定し、リトライ時にログ出力するretryデコレータのloggerパラメータにloggerを設定することで、リトライ時にログ出力することができます。ApiConnectionError('API接続エラー')実行結果は以下の通りです。リトライ時にエラーメッセージとリトライ間隔がログ出力されます。API接続エラーまとめ以上、今回はPythonでのリトライについて、ループで実装するパターンと、retryモジュールで実装するパターンの2パターンについてご紹介しました。実装の手軽さを考慮すると、特別ライブラリのインストールができない環境ではない限り、retryモジュールを導入したほうがメリットは大きいです。はてなブログPro都内でGCP、Python使ったデータエンジニアやってます。クラウドでの設計~開発・運用まで全部やります。20代文系エンジニアです。GCP、Python中心に、データエンジニアとして学んでいる技術をご紹介する記事を書いています。BigQueryとAirflowとバイクと鳥が好き。アイコンはたまたまお魚を加えていたときのカワセミさん。引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。