# -*- coding: utf-8 -*- """ @author:XuMingï¼[email protected]) @description: """ import signal import time def set_timeout(num,callback): def wrap(func): def handle(signum, frame): # æ¶å°ä¿¡å· SIGALRM åçåè°å½æ°ï¼ç¬¬ä¸ä¸ªåæ°æ¯ä¿¡å·çæ°åï¼ç¬¬äºä¸ªåæ°æ¯the interrupted stack frame. raise RuntimeError def to_do(*args,**kwargs): try: signal.signal(signal.SIGALRM, handle) # 设置信å·ååè°å½æ° signal.alarm(num) # 设置 num ç§çé¹é print('start alarm signal.') r = func(*args,**kwargs) print('close alarm signal.') signal.alarm(0) # å ³éé¹é return r except RuntimeError as e: callback() return to_do return wrap def after_timeout(): # è¶ æ¶åçå¤ç彿° print("do something after timeout.") raise RuntimeError @set_timeout(2,after_timeout) # éæ¶ 2 ç§è¶ æ¶ def connect(): # è¦æ§è¡ç彿° time.sleep(2.4) # 彿°æ§è¡æ¶é´ï¼å大äº2çå¼ï¼å¯æµè¯è¶ æ¶ return "宿" class Demo: @set_timeout(2,after_timeout) def conn(self): time.sleep(3) return "ok" if __name__ == '__main__': try: a = connect() print(a) except Exception as e: a = 'err' print(a) b = Demo() try: c = b.conn() print(c) except RuntimeError as e: print('run time err.')