Hi, Sorry for resurrecting an old thread, but it just bothers me that this is the best way that python has to deal with killing running functions... it's quite an ugly hack, no?
Is it a feature that's needed bit missing from python, or is it left out on purpose (same way like java has deprecated thread.stop and thread.suspend because they were not safe)? Thanks, Noam -----Original Message----- From: python-list-bounces+noama=answers....@python.org [mailto:python-list-bounces+noama=answers....@python.org] On Behalf Of Albert Hopkins Sent: Wednesday, February 04, 2009 5:26 PM To: python-list@python.org Subject: Re: Kill a function while it's being executed On Wed, 2009-02-04 at 13:40 +0200, Noam Aigerman wrote: > Hi All, > I have a script in which I receive a list of functions. I iterate over > the list and run each function. This functions are created by some other > user who is using the lib I wrote. Now, there are some cases in which > the function I receive will never finish (stuck in infinite loop). > Suppose I use a thread which times the amount of time passed since the > function has started, Is there some way I can kill the function after a > certain amount of time has passed (without asking the user who's giving > me the list of functions to make them all have some way of notifying > them to finish)? > Thanks, Noam Noam, did you hijack a thread? You could decorate the functions with a timeout function. Here's one that I either wrote or copied from a recipe (can't recall): class FunctionTimeOut(Exception): pass def function_timeout(seconds): """Function decorator to raise a timeout on a function call""" import signal def decorate(f): def timeout(signum, frame): raise FunctionTimeOut() def funct(*args, **kwargs): old = signal.signal(signal.SIGALRM, timeout) signal.alarm(seconds) try: result = f(*args, **kwargs) finally: signal.signal(signal.SIGALRM, old) signal.alarm(0) return result return funct return decorate Then func_dec = function_timeout(TIMEOUT_SECS) for func in function_list: timeout_function = func_dec(func) try: timeout_function(...) except FunctionTimeout: ... -a -- http://mail.python.org/mailman/listinfo/python-list -- http://mail.python.org/mailman/listinfo/python-list