Implementing Timers in Python
Jump to navigation
Jump to search
Using UNIX Like Functionality
This script makes use of UNIX derived signal methods.
import signal, time
class TimedOutExc(Exception):
def __init__(self, value = "Timed Out"):
self.value = value
def __str__(self):
return repr(self.value)
def TimedOutFn(f, timeout, *args, **kwargs):
def handler(signum, frame):
raise TimedOutExc()
old = signal.signal(signal.SIGALRM, handler)
signal.alarm(timeout)
try:
result = f(*args, **kwargs)
finally:
signal.signal(signal.SIGALRM, old)
signal.alarm(0)
return result
def timed_out(timeout):
def decorate(f):
def handler(signum, frame):
raise TimedOutExc()
def new_f(*args, **kwargs):
old = signal.signal(signal.SIGALRM, handler)
signal.alarm(timeout)
try:
result = f(*args, **kwargs)
finally:
signal.signal(signal.SIGALRM, old)
signal.alarm(0)
return result
new_f.func_name = f.func_name
return new_f
return decorate
def fn_1(secs):
time.sleep(secs)
return "Finished"
@timed_out(4)
Using pywin
#!/usr/bin/env python
try:
import os
import sys
import time
import msvcrt
import winsound
except ImportError, error:
sys.stdout.write('ImportError: %s' % error)
sys.exit(1)
def main():
try:
alarm(*map(float, sys.argv[1:]))
except:
sys.stdout.write(os.path.basename(sys.argv[0]))
sys.stdout.write(' <hours> <minutes> <seconds>')
def alarm(hours, minutes, seconds):
time.sleep(abs(hours * 3600 + minutes * 60 + seconds))
while msvcrt.kbhit():
msvcrt.getch()
while not msvcrt.kbhit():
winsound.Beep(440, 250)
time.sleep(0.25)
if __name__ == '__main__':
main()