John O'Hagan <resea...@johnohagan.com> wrote: > Is there a concise Pythonic way to write a method with a timeout? > > I did this: > > class Eg(object): > > def get_value(self, timeout): > > from threading import Timer > self.flag = True > > def flag_off(): > self.flag = False > timer = Timer(timeout, flag_off) > timer.start() > > while self.flag: > #do stuff for a long time to get some value > if condition: #if we ever get the value > self.value = value > break > > but it seems hackish to have a special "flag" attribute just to manage the > timeout within the the method.
How about something like this from threading import Timer class Duration(object): def __init__(self, duration): self.running = True self.timer = Timer(duration, self.set_finished) self.timer.setDaemon(True) self.timer.start() def set_finished(self): self.running = False def __nonzero__(self): return self.running from time import sleep def long_function(): duration = Duration(5) i = 0 print "starting" while duration: print i i += 1 sleep(1) print "finished" long_function() Which prints starting 0 1 2 3 4 finished -- Nick Craig-Wood <n...@craig-wood.com> -- http://www.craig-wood.com/nick -- http://mail.python.org/mailman/listinfo/python-list