最近在爬公告,但是用 Pdfminer3k 把PDF转成TXT的时候由于某些PDF格式不规范很容易出现转一个文件要很久出现类似于程序假死的状况,然而事实上这种情况出现的时候我更偏向于跳过这个公告等全部爬完后统一处理,所以我就给PDF转TXT的函数加了一个装饰器来专门应对这种情况。主要的功能是对每一个循环设置最大运行时间,如果一次循环运行时间超过这个阈值,就跳过这次循环进入下一个循环,类似于 requests 库的 timeout 功能。只不过 requests 库的 timeout 是内嵌的,只在调用 requests 时才能使用,而这个装饰器的 timeout 功能可以用于脚本中的任一个函数。
这个装饰器函数来自脚本之家,这里只是稍作修改。发到自己的博客上只是为了记录和存储,方便日后查看。
import signal
import time
def set_timeout(num, callback):
def wrap(func):
def handle(signum, frame): # 收到信号 SIGALRM 后的回调函数,第一个参数是信号的数字,第二个参数是the interrupted stack frame.
raise RuntimeError
def to_do(*args, **kwargs):
try:
signal.signal(signal.SIGALRM, handle) # 设置信号和回调函数
signal.alarm(num) # 设置 num 秒的闹钟
r = func(*args, **kwargs)
signal.alarm(0) # 关闭闹钟
return r
except RuntimeError as e:
callback()
return to_do
return wrap
def after_timeout(): # 超时后的处理函数
print("do something after timeout.")
使用的时候语法如下:
@set_timeout(50,after_timeout())
def parse(evendate, docucode):
print("这是需要加载timeout功能的函数")
参考链接: