有時候需要給函數設置超時機制,以防止它卡住我們的程序,這里可以用python的signal模塊,signal模塊可以實現程序內部的信號處理。
# coding:utf8 import time import signal # 自定義超時異常 class TimeoutError(Exception): def __init__(self, msg): super(TimeoutError, self).__init__() self.msg = msg def time_out(interval, callback): def decorator(func): def handler(signum, frame): raise TimeoutError("run func timeout") def wrapper(*args, **kwargs): try: signal.signal(signal.SIGALRM, handler) signal.alarm(interval) # interval秒后向進程發送SIGALRM信號 result = func(*args, **kwargs) signal.alarm(0) # 函數在規定時間執行完后關閉alarm鬧鍾 return result except TimeoutError, e: callback(e) return wrapper return decorator def timeout_callback(e): print(e.msg) @time_out(2, timeout_callback) def task1(): print("task1 start") time.sleep(3) print("task1 end") @time_out(2, timeout_callback) def task2(): print("task2 start") time.sleep(1) print("task2 end") if __name__ == "__main__": task1() task2()
輸出為:
>>> task1 start >>> run func timeout >>> task2 start >>> task2 end
可以看到,雖然task1超時了,但是它不會影響我們程序的執行。
另外信號機制只能在主線程中生效, 意味着你不能在多線程中使用它,python已經很好的支持了協程,因此我們可以使用協程代替多線程。