Python 代码执行超时判断

  1. 通过 signal 信号处理函数

import signal

# 自定义异常类(继承自BaseException,这样Exception就捕获不到)
class TimeoutException(BaseException):
    pass


# 超时信号函数
def set_timeout(seconds):
    # 设置信号接收函数(signal.signal(sig,action),sig为信号,action为信号处理函数)
    signal.signal(signal.SIGALRM, timeout_handler)
    # 发送SIGALRM超时信号
    signal.alarm(seconds)


# 信号处理函数(signum即信号编号,frame信号中断那一刻的栈帧)
def timeout_handler(signum, frame):
    raise TimeoutException("执行超时异常")


主函数
def main():
    try:
        # 首先,注册超时警告的信号处理函数,给定超时时间为10秒
        set_timeout(10)

        # 然后,可以执行需要监控的代码段,譬如sql查询、复杂计算等
        ...

        # 最后,如果在超时时间内完成上述代码段,则应该关闭定时器;如果未能在超时时间内完成上述代码,就会触发信号处理函数timeout_handler(),即抛出异常,我们可以捕获并进行进一步处理
        signal.alarm(0)
    except TimeoutException as e:
        print(e)

  1. 通过eventlet (一个处理网络和并发的库)

import eventlet

# 主函数
def main():
    # 设置超时函数前,必须执行这行代码,引入path
    eventlet.monkey_patch()
    
    try:
        # 设置超时函数(第一个参数是超时时间10秒;第二个参数如果是True,超时则会触发异常、如果是False,则不会触发异常,但是会跳过with eventlet代码段内剩余代码,with eventlet代码段外其他代码仍会正常执行)
        with eventlet.Timeout(10, True):
            # 然后,可以执行需要监控的代码段,譬如sql查询、复杂计算等
            ...
        
        # 其他代码,监控完成之后的代码
        ...
    except eventlet.timeout.Timeout as e:
    # except:   # 或者该种方法也能捕获
        print(e)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值