プログラムを作るうえで必ず考慮しなければならいものの1つがリトライ処理ですよね。
常に問題なくプログラムが動き続けることが理想ではあるのですが、
設計時点やコードを書いている時点では予想もしていなかったことが起き、
プログラムが止まってしまうことは多々あります。
僕の場合、Python を使用してのWEBスクレイピングツールや、
何かしらインターネット上からの情報取得を自動化するツールを作成することが多く、
外部要因によってインターネット接続が切れてしまい、プログラムが途中停止してしまうことが結構ありました。
そのため、インターネット接続に失敗したり、接続先のサイトから正常な応答が得られなかった場合に
リトライ処理を入れる必要があり、今回その実装方法について調べてみました。
この記事では、コピペするだけでリトライ処理を導入できるサンプルコードを紹介します。
指定回数だけリトライするサンプルコード
処理に失敗した際に、10回だけリトライを実行し、
リトライに成功した場合は “Success!” を表示させ、リトライに失敗した場合は次の処理へ移るという場合のサンプルコードです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
MAX_RETRY = 10 for i in range(MAX_RETRY + 1): # 実行したい処理 try: 【失敗しそうな処理】 # 失敗時の処理 except Exception as e: print("Failed!. retry={}/{}".format(i, MAX_RETRY)) time.sleep(5) # 失敗しなかった時はループを抜ける else: print("Success!") break # リトライが全部失敗した時の処理 else: pass |
|
|
無制限にリトライするサンプルコード
処理が成功するまでリトライし続けるコードのサンプルは以下です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
while True: # 実行したい処理 try: 【失敗する可能性のある処理】 # 処理が失敗したときの処理 except Exception as e: print("Failed!") time.sleep(5) # 接続が成功したときに実行される else: print("Success!") break |
このコードを使用する場合、例えばスクレイピングで無限リトライなどをしてしまうと、
接続先のサイトに対して負荷をかけすぎてしまうなどの悪影響を及ぼす可能性があります。
また、処理結果をログ出力している場合では、延々とリトライのログが出力され続け、
ログファイルサイズがとんでもなく肥大してしまってディスク容量を圧迫することが
考えられますので、使いどころには十分注意してください。
|
|
指定回数だけリトライし、失敗後にプログラム終了するサンプルコード
指定回数だけリトライ処理をし、そのすべてが失敗したときに
プログラムを停止させたい場合は、以下のようにコードを書けばよいです。
(例えば、インターネット接続確認に20回失敗したらプログラムを終了させたい、など)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
import sys MAX_RETRY = 10 for i in range(MAX_RETRY + 1): # 実行したい処理 try: 【失敗しそうな処理】 # 失敗時の処理 except Exception as e: print("Failed!. retry={}/{}".format(i, MAX_RETRY)) time.sleep(5) # 失敗しなかった時はループを抜ける else: print("Success!") break # リトライが全部失敗した時の処理 else: print("Internet connection is disabled.") sys.exit() #★この処理を追加 |
さいごに
リトライ処理を入れることで、想定外事象によるプログラムの中断が劇的に減り、
自作ツールの幅も広がりました。
ちなみに Python には retry モジュールなるものが用意されており、
これを利用することでリトライ処理を簡潔に導入できるようです。
今回は while 文や try 文との組み合わせで実装しましたが、
そのうち retry モジュールについても勉強してみようと思います。
コメント