Timeout():真實情境範例

Python 函式寫作

Shayne Miel

Software Architect @ Duo Security

Timeout


def function1():
  # 這個函式有時會跑超久
  ...

def function2(): # 這個函式有時會卡住不回傳 ...
Python 函式寫作

Timeout

@timeout
def function1():
  # 這個函式有時會跑超久
  ...

@timeout def function2(): # 這個函式有時會卡住不回傳 ...

碼錶

Python 函式寫作

Timeout-背景知識

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 函式寫作

一起來練習吧!

Python 函式寫作

Preparing Video For Download...