时间:2021-05-22
我们在使用 requests 这类网络请求第三方库时,可以看到它有一个参数叫做 timeout ,就是指在网络请求发出开始计算,如果超过 timeout 还没有收到返回,就抛出超时异常。(当然存在特殊情况timeout 会失效,请看Timeouts and cancellation for humans* 这篇文章中作者的举例,我们不考虑这种特殊情况)。
但大家有没有考虑过,如何为普通的函数设置超时时间?特别是在运行一些数据处理、AI 相关的代码时,某个函数可能会运行很长时间,我们想实现,在函数运行超过特定的时间时,自动报错。
例如有这样一个场景,我写了一个函数 calc_statistic(datas) ,根据用户传入的数据计算某个值。但如果用户传入的数据非常大,这个函数就可能运行很长时间。我想设置让这个函数最多运行10秒钟。如果10秒还没有运行完成,就报错。应该怎么办呢?
如果你的电脑操作系统是 Linux 或者 macOS,那么 可以使用 signal 来解决。
在公众号前几天的文章中,我们介绍了使用signal来接管键盘的中断信号,用到的是 signal.SIGINT 。今天我们要用到的是 signal.SIGALRM 。
首先我们来看看这个信号的使用方法:
import timeimport signaldef 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 timeimport signalclass FuncTimeoutException(Exception): passdef 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 decoratorsignal.signal(signal.SIGALRM, handler)我们来试一试测试一下这个函数超时装饰器。首先测试函数的运行时间小于超时时间时,程序正常运行没有问题:
再来测试一下函数运行时间超过超时时间的情况:
正常抛出 FuncTimeoutException 异常。
那我们在实际使用中,可以使用 try...except FuncTimeoutException 捕获这个异常,然后实现自定义的处理流程,例如:
try: clac_statistic(100)except FuncTimeException: print('该函数运行超时,运行自定义的处理流程')当然你如果想直接跳过这个异常也没问题:
import contextlib:with contextlib.supress(FuncTimeException): clac_statistic(100)总结
以上所述是小编给大家介绍的在 Linux/Mac 下为Python函数添加超时时间的方法,希望对大家有所帮助,也非常感谢大家对网站的支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
前言在Python2.x中的几个用来执行命令行的库或函数在执行命令是均不能设置一个命令执行的超时时间,用来在命令执行时间超时时终端这个命令的执行,这个功能在3.
一.增加超时的时间限制这里需要注意:set_time_limit只是设置你的PHP程序的超时时间,而不是file_get_contents函数读取URL的超时时
hystrix参数使用方法通过注解@HystrixCommand的commandProperties去配置,如下就是hystrix命令超时时间命令执行超时时间,
Pyspider中采用了tornado库来做http请求,在请求过程中可以添加各种参数,例如请求链接超时时间,请求传输数据超时时间,请求头等等,但是根据pysp
本文实例讲述了php页面函数设置超时限制的方法。分享给大家供大家参考。具体方法如下:碰到页面程序执行超时时会提醒Fatalerror:Maximumexecut