with timeout(...):

Klaas mike.klaas at gmail.com
Tue Mar 27 03:20:44 CEST 2007

On Mar 26, 3:30 am, Nick Craig-Wood <n... at craig-wood.com> 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):

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, ...)
       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.


More information about the Python-list mailing list