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__.TookTo oLong: 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.