初めてデコレータおよびsignalを使用して書いてみました。指定時間内に関数が終了しなかったら通知してくれるデコレータです。AWSで夜間バッチを動かした時に時間がかかりすぎているバッチを通知してくれる、なんていう使い方ができそうです。
pytimekeeper.py
# -*- coding: utf-8 -*-
import signal
import boto.sns
def timeout(limit, topic, subject='Execution Timeout.', body='Please check program.', region='us-east-1'):
'''
使い方:指定した実行時間に終了しなかった場合、awsのsnsで通知するデコレータです。
@timeout(limit=3600, topic='arn:aws:sns:xxxxxxxx:yyyyyyy')
def long_time_function():
very_very_long_calc()
'''
def notify_aws_sns(signum, frame):
conn = boto.sns.connect_to_region(region)
conn.publish(topic, body, subject)
def __decorator(function):
def __wrapper(*args, **kwargs):
signal.signal(signal.SIGALRM, notify_aws_sns)
signal.alarm(limit)
result = function(*args, **kwargs)
signal.alarm(0)
return result
return __wrapper
return __decorator