how to run an arbitrary function with timeout?

Garry Hodgson garry at sage.att.com
Fri May 14 12:11:40 EDT 2004


i'm building a test suite on top of unittest, and some
of the tests involve things that might hang, like trying
to connect to a wedged server.  so i'd like a simple function
that i can call that will run a given (func,args) pair and
return either the value or raise an exception if it times
out.  this seems like it should be straightforward, but i've
not had much luck getting it to work.

my latest attempt, below, raises the exception ok,
but still doesn't return until snooze() completes:

   --> xx
   going to sleep
   Traceback (most recent call last):
     File "./xx", line 26, in ?
       print RunWithTimeout( snooze, (10,), 2 )
     File "./xx", line 16, in RunWithTimeout
       raise TookTooLong, 'fsdfsdf'
   __main__.TookTooLong: fsdfsdf

...8 second delay here...

   waking up


can someone tell me what i'm doing wrong?

thanks

------------------------
#!/usr/bin/env python2.3

from threading import *
from time import sleep

class TookTooLong( Exception ):
        pass

def RunWithTimeout( func, args, timeout ):
        t = Thread( target=func, args=args )
        t.start()
        t.join( timeout )

        if t.isAlive():
                del t
                raise TookTooLong, 'fsdfsdf'
        return 'ok'


def snooze( duration ):
        print 'going to sleep'
        sleep( duration )
        print 'waking up'

if __name__ == '__main__':
        print RunWithTimeout( snooze, (10,), 2 )

----
Garry Hodgson, Technology Consultant, AT&T Labs

Be happy for this moment.
This moment is your life.




More information about the Python-list mailing list