具有预定义持续时间的超时函数
在 shell 脚本中,有一种机制可以终止长时间运行的任务,以避免过度等待。这里面临的挑战是将函数包装在超时脚本中,如果超过指定的时间限制,则返回 False。
一种方法是设置一个异步计时器,在预定义的时间间隔后触发 False 响应。幸运的是,可以使用 signal 库(在基于 UNIX 的系统上可用)中的信号处理程序来实现这样的解决方案。
该过程涉及创建利用信号的自定义装饰器 (@timeout)。 Alarm() 设置所需时间间隔的闹钟。在装饰函数中,当警报到期时,会引发 TimeoutError 异常,从而有效地中断操作。
要将此解决方案合并到您的代码中,请将以下代码保存为 timeout.py 并导入它:
import errno import os import signal import functools class TimeoutError(Exception): pass def timeout(seconds=10, error_message=os.strerror(errno.ETIME)): def decorator(func): def _handle_timeout(signum, frame): raise TimeoutError(error_message) @functools.wraps(func) def wrapper(*args, **kwargs): signal.signal(signal.SIGALRM, _handle_timeout) signal.alarm(seconds) try: result = func(*args, **kwargs) finally: signal.alarm(0) return result return wrapper return decorator
现在,在您的应用程序代码中,使用 @timeout 装饰器注释任何可能长时间运行的函数。例如:
from timeout import timeout # Short timeout @timeout(5) def slow_function(): # ... # Default timeout @timeout def another_slow_function(): # ... # Customize timeout and error message @timeout(30, error_message="Task timed out") def yet_another_slow_function(): # ...
这种方法确保如果函数花费的时间超过指定的超时间隔,它将引发 TimeoutError 并返回 False,从而允许您优雅地处理意外延迟。
以上是如何在 Shell 脚本中实现具有预定义持续时间的超时功能?的详细内容。更多信息请关注PHP中文网其他相关文章!