oceanusで作っているプロセスで、ログも何も吐かずに停止してしまうものがあり、タイムアウト処理を追加しようと思った。
環境はLinuxでpython3.5
検索したらデコレータ形式で簡単に使える下記を見つけた
pipからインストール可能
pip install timeout-decorator
タイムアウトの時間が来たら突然終わらせるのではなく、処理中のものを保存してから終了したかった。
タイムアウトした際はTimeoutErrorが出るので、それをtryでキャッチできれば簡単。
こんな感じ。
from timeout_decorator import timeout, TimeoutError from sys import exit MAIN_PROCESS_TIMEOUT = 30 class sampleClass: @timeout(MAIN_PROCESS_TIMEOUT) def main(self): """メインの処理""" pass def clean_up(self): """データを退避する処理""" pass if __name__ == '__main__': while True: sample = sampleClass() try: sample.main() except TimeoutError: sample.clean_up() exit()
mainの中にMAIN_PROCESS_TIMEOUTを超えるsleepを挟んだところ問題なく動いた。
こういうときにデコレータは便利。
いちばんやさしいPythonの教本 人気講師が教える基礎からサーバサイド開発まで (「いちばんやさしい教本」シリーズ)
- 作者: 鈴木たかのり,杉谷弥月,株式会社ビープラウド
- 出版社/メーカー: インプレス
- 発売日: 2017/08/10
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る
- 作者: Mark Summerfield,斎藤康毅
- 出版社/メーカー: オライリージャパン
- 発売日: 2015/12/01
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (1件) を見る