Kill a function while it's being executed

Albert Hopkins marduk at letterboxes.org
Wed Feb 4 10:25:52 EST 2009


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






More information about the Python-list mailing list