首页 >后端开发 >Python教程 >如何在 Shell 脚本中实现具有预定义持续时间的超时功能?

如何在 Shell 脚本中实现具有预定义持续时间的超时功能?

Barbara Streisand
Barbara Streisand原创
2024-12-07 11:25:15331浏览

How to Implement a Timeout Function in Shell Scripting with a Predefined Duration?

具有预定义持续时间的超时函数

在 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn