如何破解usb加密狗软件

在公众号前几天的文章中,我们介绍了使用signal来接管键盘的中断信号,用到的是signal.SIGINT。今天我们要用到的是signal.SIGALRM。
首先我们来看看这个信号的使用方法:
import time
import signal

def handler(signum, _):
print(‘定时到!’)
raise Exception(‘定时到了!’)

def clac_statistic(datas):
time.sleep(100)

signal.signal(signal.SIGALRM, handler)
signal.alarm(5)
clac_statistic(‘xxx’)
复制代码运行效果如下图所示:

首先绑定signal.SIGALRM事件到handler函数中,然后使用signal.alarm(10)延迟10秒发送一个信号。10秒到了以后,函数handler被运行。在函数中抛出了一个异常,导致程序结束。clac_statistic函数原本要运行100秒,但是在10秒以后就停止了,从而实现了函数的超时功能。
基于以上原理,我们实现一个装饰器,来简化为不同函数设置超时功能:
import time
import signal

class FuncTimeoutException(Exception):
pass

def handler(signum, _):
raise FuncTimeoutException(‘函数定时到了!’)

def func_timeout(times=0):
def decorator(func):
if not times:
return func
def wraps(*args, **kwargs):
signal.alarm(times)
result = func(*args, **kwargs)
signal.alarm(0) # 函数提前运行完成,取消信号
return result
return wraps
return decorator

signal.signal(signal.SIGALRM, handler)
复制代码我们来试一试测试一下这个函数超时装饰器。首先测试函数的运行时间小于超时时间时,程序正常运行没有问题:

再来测试一下函数运行时间超过超时时间的情况:

正常抛出FuncTimeoutException异常。
那我们在实际使用中,可以使用try…except FuncTimeoutException捕获这个异常,然后实现自定义的处理流程,例如:
try:
clac_statistic(100)
except FuncTimeException:
print(‘该函数运行超时,运行自定义的处理流程’)
复制代码当然你如果想直接跳过这个异常也没问题:
import contextlib:
with contextlib.supress(FuncTimeException):
clac_statistic(100)

扫描二维码关注公众号,回复: 9282032 查看本文章
发布了60 篇原创文章 · 获赞 10 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/a59612/article/details/104399849