GAミント至上主義

安くて速いが好きなWEBアプリ開発者。最近はPython, Vue.js, Firebase, GKE。@株式会社ビズオーシャン

Pythonでタイムアウト処理

oceanusで作っているプロセスで、ログも何も吐かずに停止してしまうものがあり、タイムアウト処理を追加しようと思った。
環境はLinuxでpython3.5

検索したらデコレータ形式で簡単に使える下記を見つけた

qiita.com
github.com


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の教本 人気講師が教える基礎からサーバサイド開発まで (「いちばんやさしい教本」シリーズ)

いちばんやさしいPythonの教本 人気講師が教える基礎からサーバサイド開発まで (「いちばんやさしい教本」シリーズ)


実践 Python 3

実践 Python 3