1

I have created a function timeout_func that will run an another function normally and return its output, but if the function exceeds 'secs' it will return a string 'failed'. Basically, it's a workaround to timeout a function which could run infinitely. (python 2.7 on windows) (Why do I need a workaround, why can't I just make the function non-infinite? Because sometimes you just can't do that, it' called bugs in known processes ie: fd = os.open('/dev/ttyS0', os.O_RDWR)

Anyways, my timeout_func was inspired from help I received here: kill a function after a certain time in windows

The problem with my code is that for some reason the do_this function is receiving 14 variables instead of one. I get the error msg when running it by double clicking the script or from python.exe. From IDLE you get no exception errors.... exception error message

However, if I change it to:

def do_this(bob, jim):
return bob, jim

It works just fine...

What's going on here? It doesn't like the 1 variable functions...?

import multiprocessing
import Queue


def wrapper(queue, func, func_args_tuple):
    result = func(*func_args_tuple)
    queue.put(result)
    queue.close()

def timeout_func(secs, func, func_args_tuple):
    queue = multiprocessing.Queue(1) # Maximum size is 1
    proc = multiprocessing.Process( target=wrapper, args=(queue, func, func_args_tuple) )
    proc.start()

    # Wait for TIMEOUT seconds
    try:
        result = queue.get(True, secs)
    except Queue.Empty:
        # Deal with lack of data somehow
        result = 'FAILED'
        print func_args_tuple
    finally:
        proc.terminate()

    return result


def do_this(bob):
    return bob

if __name__ == "__main__":
    print timeout_func( 10, do_this, ('i was returned') )
    x = raw_input('done')
Community
  • 1
  • 1
MistahX
  • 696
  • 2
  • 9
  • 22

1 Answers1

5

('i was returned') is not a tuple. It evaluates to a string, just like (3+2) evaluated to an integer..

Calling do_this(*('i was returned')) passes each letter of the sequence 'i was returned' as a separate argument - the equivalent of:

do_this('i', ' ', 'w', 'a', 's', ' ', 'r', 'e', 't', 'u', 'r', 'n', 'e', 'd')

Use ('i was returned',) instead to force it to be a tuple (due to the trailing comma).

Amber
  • 507,862
  • 82
  • 626
  • 550