我创建了一个函数timeout_func
,正常运行另一个函数并返回其输出,但如果函数超过'secs',它将返回一个字符串'failed'。
基本上,它是一种解决方法来超时可以无限运行的函数。 (Windows上的python 2.7)(为什么我需要一个解决方法,为什么我不能让这个函数非无限?因为有时你不能这样做,它在已知中称为错误过程即:fd = os.open('/dev/ttyS0', os.O_RDWR)
无论如何,我的timeout_func受到了我在这里收到的帮助的启发: kill a function after a certain time in windows
我的代码存在的问题是,do_this
函数由于某种原因正在接收14个变量而不是1个变量。通过双击脚本或从python.exe运行它时,我得到错误消息。从IDLE你没有异常错误....
但是,如果我将其更改为:
def do_this(bob, jim):
return bob, jim
它运作得很好......
这里发生了什么?它不喜欢1变量函数......?
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')
答案 0 :(得分:5)
('i was returned')
不是元组。它计算为一个字符串,就像(3+2)
计算为整数..
调用do_this(*('i was returned'))
将序列'i was returned'
的每个字母作为单独的参数传递 - 相当于:
do_this('i', ' ', 'w', 'a', 's', ' ', 'r', 'e', 't', 'u', 'r', 'n', 'e', 'd')
使用('i was returned',)
强制它成为一个元组(由于尾随逗号)。