Timeout():真实示例

Python 函数编写

Shayne Miel

Software Architect @ Duo Security

超时(Timeout)


def function1():
  # 该函数有时会
  # 运行很——久
  ...

def function2(): # 该函数有时会 # 卡住且不返回 ...
Python 函数编写

超时(Timeout)

@timeout
def function1():
  # 该函数有时会
  # 运行很——久
  ...

@timeout def function2(): # 该函数有时会 # 卡住且不返回 ...

秒表

Python 函数编写

超时——背景知识

import signal

def raise_timeout(*args, **kwargs): raise TimeoutError()
# 当"警报"信号触发时,调用 raise_timeout() signal.signal(signalnum=signal.SIGALRM, handler=raise_timeout)
# 5 秒后触发警报 signal.alarm(5)
# 取消警报 signal.alarm(0)
Python 函数编写
def timeout_in_5s(func):

@wraps(func) def wrapper(*args, **kwargs):
# 设置 5 秒警报 signal.alarm(5)
try: # 调用被装饰函数 return func(*args, **kwargs)
finally: # 取消警报 signal.alarm(0)
return wrapper
@timeout_in_5s
def foo():
  time.sleep(10)
  print('foo!')
foo()
TimeoutError
Python 函数编写
def timeout(n_seconds):

def decorator(func):
@wraps(func) def wrapper(*args, **kwargs):
# 设定 n 秒后触发的警报 signal.alarm(n_seconds)
try: # 调用被装饰的函数 return func(*args, **kwargs) finally: # 取消警报 signal.alarm(0)
return wrapper
return decorator
@timeout(5)
def foo():
  time.sleep(10)
  print('foo!')

@timeout(20) def bar(): time.sleep(10) print('bar!')
foo()
TimeoutError
bar()
bar!
Python 函数编写

Passons à la pratique !

Python 函数编写

Preparing Video For Download...