Kill a function while it's being executed

Noam Aigerman noama at answers.com
Wed Feb 4 16:54:09 CET 2009


About the hijacking - I *might* have done it without understanding what
I did (replied to a previous message and then changed the subject), if
that's what you mean...
Sorry

-----Original Message-----
From: python-list-bounces+noama=answers.com at python.org
[mailto:python-list-bounces+noama=answers.com at python.org] On Behalf Of
Albert Hopkins
Sent: Wednesday, February 04, 2009 5:26 PM
To: python-list at 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




More information about the Python-list mailing list