python之为函数执行设置超时时间(允许函数执行的最大时间)[python第三方库func_timeout]

网友投稿 1284 2022-08-26


python之为函数执行设置超时时间(允许函数执行的最大时间)[python第三方库func_timeout]

前言

1、通常我们在自定义一个函数后,会调用这个函数来完成我们想要的功能。就拿爬虫来举例,发送请求后服务器会在指定时间内响应(通常这个时间很短),但是有可能服务器没有返回任何数据,无论是服务器已经识别爬虫不予返回数据亦或者是服务器繁忙等其他原因,此时,爬虫程序就会一直等待来自服务器的响应,这个时候就会非常浪费资源,甚至造成程序阻塞。

2、比如说python的 requests 库中有自己的时间超时机制,例如: requests.post(url, headers=headers, data=data, proxies=proxies, timeout=15) :表示获取服务器资源的最大时间不超过15s,否则将会抛出TimeOutException异常。

3、使用python第三方 func_timeout 模块中提供的 func_set_timeout 装饰器可以非常简单的设置python程序的超时时间,超时后程序抛出 func_timeout.exceptions.FunctionTimedOut 异常。此时再用 try-except 做异常处理即可。

安装模块

pip install func_timeout

导入模块

from func_timeout import func_set_timeout

实例1

代码如下:

import timefrom func_timeout import func_set_timeout@func_set_timeout(5)def timer(): for num in range(1, 11): time.sleep(1) print(num)timer()

运行结果:

设置函数运行最大超时时间为11s时,程序可以正常执行到结束:

import timefrom func_timeout import func_set_timeout@func_set_timeout(11)def timer(): for num in range(1, 11): time.sleep(1) print(num)timer()

运行结果如下:

实例2

添加函数执行超时捕获异常

代码如下:

import timefrom func_timeout import func_set_timeoutimport func_timeout @func_set_timeout(5)def timer(): for num in range(1,11): time.sleep(1) print(num) try: timer()except func_timeout.exceptions.FunctionTimedOut as e: print(e) print("Time out!!!")

运行结果:

实例3

结合python函数装饰器一起使用:

代码如下:

import timefrom func_timeout import func_set_timeout, FunctionTimedOutdef time_out(fn): def wrapper(*args, **kwargs): try: result = fn(*args, **kwargs) return result except FunctionTimedOut: print('timeout') return None return wrapper@time_out@func_set_timeout(2)def a(name): time.sleep(3) print(name + 'is hls') return 'b'if __name__ == '__main__': c = a(name='my name') print(c)

运行结果:

实例4

注意: func_set_timeout  装饰器装饰python类的时候对类中的方法不起作用,即不生效;但是可以将 func_set_timeout 装饰器装饰在类里面的方法中,则对python类里面指定的方法设置函数最大执行时间(超出此时间,方法会报异常)

代码1如下:

from func_timeout import func_set_timeout, FunctionTimedOutimport time@func_set_timeout(1)class TestFunction(object): def __init__(self): pass def my_test(self): time.sleep(10) print('程序内等待10s后输出')try: a = TestFunction() a.my_test() print('类中的函数执行无异常')except FunctionTimedOut as e: print('类中函数执行抛出的异常信息:', e)

执行结果:

代码2如下:

from func_timeout import func_set_timeout, FunctionTimedOutimport timeclass TestFunction(object): def __init__(self): pass @func_set_timeout(1) def my_test(self): time.sleep(10) print('程序内等待10s后输出')try: a = TestFunction() a.my_test() print('类中的函数执行无异常')except FunctionTimedOut as e: print('类中函数执行抛出的异常信息:', e)

运行结果:

去期待陌生,去拥抱惊喜。


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:极客编程python入门-变量和字符串
下一篇:Java制作证书的工具keytool用法详解
相关文章

 发表评论

暂时没有评论,来抢沙发吧~