Why is this sending so many variables?
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 ju开发者_JAVA技巧st 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....
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')
('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).
精彩评论