我想在 Python 中运行某个函数(重型函数),但我不希望它运行超过 X 秒。例如,我想运行 foo(),如果 20 秒后它没有完成处理,我希望我的程序继续运行。我不希望我的程序在 foo() 运行时继续运行,我希望它仅在 foo() 完成或 20 秒过去后继续运行(因此线程不适合这里)
有什么建议么?
我想在 Python 中运行某个函数(重型函数),但我不希望它运行超过 X 秒。例如,我想运行 foo(),如果 20 秒后它没有完成处理,我希望我的程序继续运行。我不希望我的程序在 foo() 运行时继续运行,我希望它仅在 foo() 完成或 20 秒过去后继续运行(因此线程不适合这里)
有什么建议么?
“直截了当”的方法是在函数内保持一个初始化时间,并在合理的时间(开始、循环结束、数据写入之前/之后等)检查当前时间。当然,这不一定会在 20 秒后停止,并且如果您的 foo() 在内部的任何时间点挂起,也不会起作用。
否则,您可能正在看这个:Python 中的异步方法调用?
如果您的方法正在处理套接字,那么 Python 标准库中的asyncore也可能很有用。
编辑:更深入(来自http://docs.python.org/library/multiprocessing.html#multiprocessing.Process):
import multiprocessing
#identity function, replace with your actual foo
def foo(x):
return x
if __name__ == '__main__':
foo_args = #some tuple containing non-kw arguments for your function
foo_kwargs = #some dict containing kw arguments for your function
proc = multiprocessing.Process(target=foo,args=foo_args,kwargs=foo_kwargs)
proc.start()
proc.join(20) #This takes a timeout argument in seconds
与您在问题中的假设相反,您也可以为此使用线程。您只需让父线程在调用时阻塞或直到超时(使用相同的连接调用——线程和多处理的接口是相同的)。
如果您需要函数的结果作为返回值,同一页面上的管道和队列可以返回它。