読者です 読者をやめる 読者になる 読者になる

uyamazakのブログ

仕事中の問題と解決メモ。PythonとGoogle Cloudがメイン。bizoceanで新規事業の企画と開発担当。 BigQueryを使ったビッグデータ収集・解析・リアルタイム処理プロジェクト進行中 https://github.com/uyamazak/oceanus

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 3

実践 Python 3