Skip to content

Instantly share code, notes, and snippets.

@leafsummer
Created May 10, 2021 03:00
Show Gist options
  • Save leafsummer/924c02996c769c5448f62b52811ad2ff to your computer and use it in GitHub Desktop.
Save leafsummer/924c02996c769c5448f62b52811ad2ff to your computer and use it in GitHub Desktop.
[function timeout decorator]
from threading import Thread
ThreadStop = Thread._Thread__stop
class TimeoutException(Exception):
pass
def timelimited(timeout):
def decorator(function):
def decorator2(*args,**kwargs):
class TimeLimited(Thread):
def __init__(self,_error= None,):
Thread.__init__(self)
self._error = _error
def run(self):
try:
self.result = function(*args,**kwargs)
except Exception,e:
self._error = str(e)
def _stop(self):
if self.isAlive():
ThreadStop(self)
t = TimeLimited()
t.start()
t.join(timeout)
if isinstance(t._error,TimeoutException):
t._stop()
raise TimeoutException('timeout for %s' % (repr(function)))
if t.isAlive():
t._stop()
raise TimeoutException('timeout for %s' % (repr(function)))
if t._error is None:
return t.result
return decorator2
return decorator
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment