簡單示例
# -*- coding: utf-8 -*-
import signal
import time
def handle(signum, frame):
print("逾時了")
# 注冊信号
signal.signal(signal.SIGALRM, handle)
# 設定信号發送時間
signal.alarm(3) # 開啟鬧鐘信号
print("開啟信号")
time.sleep(5)
print("關閉信号")
signal.alarm(0) # 關閉鬧鐘信号
"""
sleep 2
開啟信号
關閉信号
sleep 5
開啟信号
逾時了
關閉信号
"""
處理逾時示例
import signal
class TimeOutException(Exception):
pass
def handle(signum, frame):
raise TimeOutException("運作逾時!")
def set_timeout(timeout, callback):
def wrapper(func):
def inner(*args, **kwargs):
try:
signal.signal(signal.SIGALRM, handle)
signal.alarm(timeout) # 開啟鬧鐘信号
rs = func(*args, **kwargs)
signal.alarm(0) # 關閉鬧鐘信号
return rs
except TimeOutException as e:
callback()
return inner
return wrapper
def process_time():
print("逾時了")
@set_timeout(40, process_time)
def function():
pass
備注:逾時信号隻能設定在主線程函數,不能設定在子線程函數
參考
python 使用 signal子產品實作函數調用逾時問題