天天看點

Python程式設計:signal處理逾時問題

簡單示例

# -*- 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子產品實作函數調用逾時問題