跨平台超时装饰器

问题描述 投票:0回答:1

下面是我的简单函数,它检查另一个函数的返回值 5 分钟,如果返回值不是 True 则超时。

是否可以将此代码段转换为通用超时装饰器(跨平台 - Windows 和 Unix)?

我试过这个 - https://pypi.org/project/timeout-decorator/ 但它只支持 Unix。

import time
timeout = time.time() + 60*5   # 5 minutes from now

def read_request_output():
    while True:
        return_value = function_to_get_requests_output() # either True or False
        if return_value :
            print("Downloaded fine.")
            break
        if time.time() > timeout:
            print("Oops..")
            
python python-3.x
1个回答
0
投票

不是装饰器,而是可以使用托管超时的类。最后的使用示例:

from signal import signal, alarm, SIGALRM
import time

__name__ = 'timeout'
__all__ = ['TimeoutError', 'Timeout']

class TimeoutError(Exception):
    pass

class Timeout:
    def __init__(self, seconds=1, message="Timed out"):
        self._seconds = seconds
        self._message = message

    @property
    def seconds(self):
        return self._seconds

    @property
    def message(self):
        return self._message
    
    @property
    def handler(self):
        return self._handler

    @handler.setter
    def handler(self, handler):
        self._handler = handler

    def handle_timeout(self, *_):
        raise TimeoutError(self.message)

    def __enter__(self):
        self.handler = signal(SIGALRM, self.handle_timeout)
        alarm(self.seconds)
        return self

    def __exit__(self, *_):
        alarm(0)
        signal(SIGALRM, self.handler)

# example of use

# default timeout is 1 second
# therefore if we sleep for 2 seconds a timeout will occur
with Timeout():
    try:
        time.sleep(2)
    except Exception as e:
        print(e)
© www.soinside.com 2019 - 2024. All rights reserved.