On Mar 26, 3:30 am, Nick Craig-Wood <[EMAIL PROTECTED]> wrote: > Did anyone write a contextmanager implementing a timeout for > python2.5? > > I'd love to be able to write something like > > with timeout(5.0) as exceeded: > some_long_running_stuff() > if exceeded: > print "Oops - took too long!" > > And have it work reliably and in a cross platform way!
Doubt it. But you could try: class TimeoutException(BaseException): pass class timeout(object): def __init__(self, limit_t): self.limit_t = limit self.timer = None self.timed_out = False def __nonzero__(self): return self.timed_out def __enter__(self): self.timer = threading.Timer(self.limit_t, ...) self.timer.start() return self def __exit__(self, exc_c, exc, tb): if exc_c is TimeoutException: self.timed_out = True return True # suppress exception return False # raise exception (maybe) where '...' is a ctypes call to raise the given exception in the current thread (the capi call PyThreadState_SetAsyncExc) Definitely not fool-proof, as it relies on thread switching. Also, lock acquisition can't be interrupted, anyway. Also, this style of programming is rather unsafe. But I bet it would work frequently. -Mike -- http://mail.python.org/mailman/listinfo/python-list