@限制函数执行时间
这次爬东西发现容易被封IP但是网站人挺好,只要你重新爬一次就可以继续爬,但是对于监视这个函数是否不能执行(也就是是否被封IP)如何去搞定呢?
解决方法:
使用线程监控该方法;
监控函数如下:
class MyThread(threading.Thread):
def __init__(self, target, args=()):
"""
因为threading类没有返回值,因此在此处重新定义MyThread类,使线程拥有返回值
"""
super(MyThread, self).__init__()
self.func = target
self.args = args
def run(self):
# 接受返回值
self.result = self.func(*self.args)
def get_result(self):
# 线程不结束,返回值为None
try:
return self.result
except Exception:
return None
def limit_decor(timeout, granularity):
"""
timeout 最大允许执行时长, 单位:秒
granularity 轮询间隔,间隔越短结果越精确同时cpu负载越高
return 未超时返回被装饰函数返回值,超时则返回 False
"""
def functions(func):
def run(*args):
thre_func = MyThread(target=func, args=args)
thre_func.setDaemon(True)
thre_func.start()
sleep_num = int(timeout // granularity)
for i in range(0, sleep_num):
infor = thre_func.get_result()
if infor:
return infor
else:
time.sleep(granularity)
return False
return run
return functions
这个函数可以帮我们进行相关的监视,而且不用改任何地方
怎么使用,使用方法也很简单,只需要在我们的相关函数的前面@一下就行
@limit_decor(15, 0.02)
就行这样,然后就可以了。