python之为函数执行设置超时时间(允许函数执行的最大时间)
1、背景
通常我们在自定义一个函数后,会调用这个函数来完成我们想要的功能。
就拿爬虫来举例,发送请求后服务器会在指定时间内响应(通常这个时间很短),但是有可能服务器没有返回任何数据。
无论是服务器已经识别爬虫不予返回数据亦或者是服务器繁忙等其他原因,此时,爬虫程序就会一直等待来自服务器的响应。
这个时候就会非常浪费资源,甚至造成程序阻塞。
2、使用python第三方 func_timeout 模块中提供的 func_set_timeout 装饰器可以非常简单的设置python程序的超时时间,超时后程序抛出 func_timeout.exceptions.FunctionTimedOut 异常。此时再用 try-except 做异常处理即可。
#coding:utf-8 from func_timeout import func_set_timeout import time @func_set_timeout(5) def timer(): for num in range(10): time.sleep(1) print(num) timer()
结果如下:
3、捕捉超时抛出的异常
#coding:utf-8 import func_timeout from func_timeout import func_set_timeout import time @func_set_timeout(5) def timer(): for num in range(10): time.sleep(1) print(num) try: timer() except func_timeout.exceptions.FunctionTimedOut as e: print(e) print("函数运行时间超过5秒,强制结束运行")
运行结果如下:
通过装饰器的形式捕捉异常
#coding:utf-8 import func_timeout from func_timeout import func_set_timeout, FunctionTimedOut import time def time_out(fn): def wrapper(*args,**kwargs): try: reuslt = fn(*args,**kwargs) return result except: print("函数运行时间超过5秒,强制结束运行") return wrapper @time_out @func_set_timeout(5) def timer(): for num in range(10): time.sleep(1) print(num) timer()
运行结果如下: