下面是我的简单函数,它检查另一个函数的返回值 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..")
不是装饰器,而是可以使用托管超时的类。最后的使用示例:
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)