Why is this sending so many variables?
<p>I have created a function <code>timeout_func</code> that will <strong>run an another function normally</strong> 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 <strong>bugs</strong> in known processes ie: <code>fd = os.open('/dev/ttyS0', os.O_RDWR)</code></p>

<p>Anyways, my timeout_func was inspired from help I received here:
<a href="http://stackoverflow.com/questions/6068361/kill-a-function-after-a-certain-time-in-windows">kill a function after a certain time in windows</a></p>

<p>The problem with my code is that for some reason the <code>do_this</code> 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....
<img src="http://i.stack.imgur.com/lwaty.png" alt="exception error message"></p>

<p>However, if I change it to:</p>

<pre><code>def do_this(bob, jim):
return bob, jim
</code></pre>

<p>It works just fine...</p>

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

<pre><code>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')
</code></pre>
