Python,三秒后中断函数
有时候,我的函数会卡住。如果这个函数运行超过3秒,我想要退出这个函数,我该怎么做呢?
谢谢
3 个回答
0
我通过使用 select模块 成功地为输入设置了一个超时时间。
你应该能够根据需要正确设置你的输入类型。
i,o,e = select.select([sys.stdin],[],[],5)
这段代码会在继续之前监听输入5秒钟。
5
我也遇到过类似的情况。所以我写了一个模块,里面有一个装饰器,可以限制函数的运行时间:
import logging
import signal
from functools import wraps
MODULELOG = logging.getLogger(__name__)
class Timeout(Exception):
"""The timeout handler was invoked"""
def _timeouthandler(signum, frame):
"""This function is called by SIGALRM"""
MODULELOG.info('Invoking the timeout')
raise Timeout
def timeout(seconds):
"""Decorate a function to set a timeout on its execution"""
def wrap(func):
"""Wrap a timer around the given function"""
@wraps(func)
def inner(*args, **kwargs):
"""Set an execution timer, execute the wrapped function,
then clear the timer."""
MODULELOG.debug('setting an alarm for %d seconds on %s' % (seconds, func))
oldsignal = signal.signal(signal.SIGALRM, _timeouthandler)
signal.alarm(seconds)
try:
return func(*args, **kwargs)
finally:
MODULELOG.debug('clearing the timer on %s' % func)
signal.alarm(0)
signal.signal(signal.SIGALRM, oldsignal)
return inner
return wrap
我这样使用它:
@limits.timeout(300)
def dosomething(args): ...
在我的例子中,dosomething
是在调用一个外部程序,这个程序有时会卡住,我希望能够在这种情况下优雅地退出。
6
嗯,你可能需要先搞清楚为什么程序会卡住。如果它花了很长时间在某个工作上,或许你可以找到更有效率的方法来完成它。如果这个工作需要超过三秒钟,那在中间打断又有什么用呢?我们假设这个工作确实是需要完成的。
到底是哪个调用卡住了呢?如果你没有这个调用的代码,那你就没办法解决这个问题,除非你把它放到另一个线程里运行,并创建一个定时器来监控它。
这听起来像是你可能在试图回答一个错误的问题,但也许你是在等待一个连接或者某个应该有超时限制的操作。根据你提供的信息(或者说缺乏信息),我们很难判断到底是哪种情况。要不你发一些代码过来,这样我们才能给出更明确的答案?