python 使用装饰器模式实现方法超时退出

装饰器定义

import os
import signal
import functools
import threading

def default_timeout_handle():
    raise Exception('执行函数超时')

def set_timeout(timeout, callback=default_timeout_handle):
    """
    设置函数超时时间
    :param timeout: 超时时间,单位s
    :param callback: 回调函数
    :return:
    """
    def decorator(func):
        @functools.wraps(func)
        def wrapper(*args, **kwargs):
            if os.name == 'nt':  # Windows
                # 使用 threading 来实现超时功能
                result = [Exception('执行函数超时')]
                def target():
                    try:
                        result[0] = func(*args, **kwargs)
                    except Exception as e:
                        result[0] = e
                thread = threading.Thread(target=target)
                thread.start()
                thread.join(timeout)
                if thread.is_alive():
                    callback()
                    thread.join()  # 确保子线程能够退出
                if isinstance(result[0], Exception):
                    raise result[0]
                return result[0]
            else:  # Unix/Linux
                def handle(signum, frame):
                    callback()
                old_handler = signal.signal(signal.SIGALRM, handle)
                signal.alarm(timeout)
                try:
                    result = func(*args, **kwargs)
                finally:
                    signal.signal(signal.SIGALRM, old_handler)
                    signal.alarm(0)
                return result
        return wrapper
    return decorator

装饰器使用

import time

def long_running_function(seconds):
    print(f"开始执行一个可能需要 {seconds} 秒的函数...")
    time.sleep(seconds)  # 模拟长时间运行的操作
    print("函数执行完成。")
    return "结果"


@set_timeout(5)
def long_running_function_with_timeout(seconds):
    return long_running_function(seconds)

# 调用带有超时的函数
try:
    result = long_running_function_with_timeout(10)  # 设置为10秒,超过5秒超时
    print(f"函数返回的结果是: {result}")
except Exception as e:
    print(f"捕获到异常: {e}")

输出

开始执行一个可能需要 10 秒的函数...
捕获到异常: 执行函数超时

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 单例模式是一种软件设计模式,其目的是保证一个类只有一个实例,并提供一个全局访问点来访问这个实例。 在 Python 中,可以使用装饰器实现单例模式。类装饰器是一种特殊的装饰器,它可以在定义类时使用,用于修改类的行为。 下面是使用装饰器实现单例模式的示例代码: ``` def singleton(cls): instance = None def wrapper(*args, **kwargs): nonlocal instance if instance is None: instance = cls(*args, **kwargs) return instance return wrapper @singleton class MyClass: pass ``` 在上面的代码中,`singleton` 是一个类装饰器,它接受一个类作为参数,并返回一个内部函数 `wrapper`。`wrapper` 函数检查是否已经创建了类的实例,如果没有,就创建一个新的实例,并将其保存在 `instance` 变量中。如果已经创建了实例,就直接返回该实例。 使用装饰器实现单例模式时,可以使用 `nonlocal` 声明来修改内部函数中的局部变量,这样就可以在多次调用 `wrapper` 函数时保存类的实例。 使用装饰器实现单例模式后,就可以像调用普通类一样调用单 ### 回答2: Python的单例模式可以通过使用装饰器实现。类装饰器可以在原始类上添加额外的功能,比如只实例化一个对象。 下面是一个使用装饰器实现Python单例模式的例子: ```python def singleton(cls): instances = {} def wrapper(*args, **kwargs): if cls not in instances: instances[cls] = cls(*args, **kwargs) return instances[cls] return wrapper @singleton class MyClass: def __init__(self, x): self.x = x # 测试 obj1 = MyClass(10) obj2 = MyClass(20) # obj1 和 obj2指向同一个对象 print(obj1.x) # 输出 10 print(obj2.x) # 输出 10 print(obj1 is obj2) # 输出 True ``` 在这个例子中,我们定义了一个名为singleton的装饰器函数。singleton函数接受一个类作为参数,并返回一个新的封装函数wrapper。wrapper函数在被调用时会首先检查是否已经存在该类的实例,如果不存在则创建一个新的实例并保存在字典instances中,然后返回该实例。这样,每次创建新的对象时都会先检查是否已经有了同样类的实例,如果有则返回之前的实例,实现了单例模式。 我们的示例中,我们定义了一个名为MyClass的类,并在其上应用了singleton装饰器。这样,无论我们创建多少个MyClass的实例,它们都会指向同一个对象,因为只有第一次创建时实际上调用了MyClass的构造函数,后续创建都直接返回了之前的实例。 使用装饰器实现Python单例模式可以简化代码,并且保证了只有一个实例存在。这对于需要限制实例数量的场景非常有用。 ### 回答3: Python的单例模式是一种设计模式,用于确保一个类只有一个实例,并提供一个全局访问点。 使用装饰器实现Python的单例模式是一种常见的方法。类装饰器是一个接受类作为参数并返回修改后的类的函数。 下面是一个使用装饰器实现Python单例模式的例子: ```python def singleton(cls): instances = {} def wrapper(*args, **kwargs): if cls not in instances: instances[cls] = cls(*args, **kwargs) return instances[cls] return wrapper @singleton class MyClass: def __init__(self, name): self.name = name def say_hello(self): print("Hello, I am", self.name) # 创建实例 obj1 = MyClass("Object 1") obj2 = MyClass("Object 2") # 打印实例的名称 print(obj1.name) # Output: Object 1 print(obj2.name) # Output: Object 1 # 调用实例的方法 obj1.say_hello() # Output: Hello, I am Object 1 obj2.say_hello() # Output: Hello, I am Object 1 ``` 在上述例子中,`singleton` 是一个类装饰器函数。当我们在 `MyClass` 类上使用 `@singleton` 时,`singleton(MyClass)` 被调用并返回一个新的类 `wrapper`。在这个新的类 `wrapper` 中,我们使用 `instances` 字典来存储已经创建的实例。在 `wrapper` 的构造函数中,我们首先检查 `cls` 是否已经在 `instances` 中,如果没有,则创建一个新的实例并将其添加到 `instances` 中。最后,我们返回 `instances[cls]`,即返回已经创建的实例。 通过使用装饰器实现Python的单例模式,我们可以确保在程序运行时只有一个实例存在,并且可以通过任何地方访问该实例。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值