Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.python > #91087

decorators and alarms

Date 2015-05-22 20:15 -0600
Subject decorators and alarms
From Jason Friedman <jsf80238@gmail.com>
Newsgroups comp.lang.python
Message-ID <mailman.249.1432347717.17265.python-list@python.org> (permalink)

Show all headers | View raw


I have the following code to run a shell command and kill it if it
does not return within a certain amount of time:

def run_with_time_limit(command, limit):
    """Run the given command via a shell.
    Kill the command, and raise an exception, if the
    execution time exceeds <limit> seconds.
    Else return (exit_code, stdout, stderr, duration)."""
    class Alarm(Exception):
        pass
    def alarm_handler(signum, frame):
        raise Alarm
    start_stamp = time.time()
    signal.signal(signal.SIGALRM, alarm_handler)
    signal.alarm(limit)
    try:
        process = subprocess.Popen(
            command,
            stderr=subprocess.PIPE,
            stdout=subprocess.PIPE,
            shell=True)
        stdout, stderr = process.communicate()
        duration = time.time() - start_stamp
        signal.alarm(0) # reset the alarm
    except Alarm:
        process.kill()
        raise Alarm("The command did not return within %(limit)s
seconds." % locals())
    return (process.returncode, stdout, stderr, duration)

run_with_time_limit("sleep 2", 1)

This works as desired.

But, I'd like to expand this to take some generic code, not just a
shell command, and terminate it if it does not return quickly.

@time_limiter
def generic_function(arg1, arg2, time_limit=10):
    do_some_stuff()
    do_some_other_stuff()
    return val1, val2

If generic_function does not finish within 10 seconds it would stop
executing and throw an exception.

May I have some hints, please?

Back to comp.lang.python | Previous | Next | Find similar | Unroll thread


Thread

decorators and alarms Jason Friedman <jsf80238@gmail.com> - 2015-05-22 20:15 -0600

csiph-web