欢迎来到思维库

思维库

在 Linux/Mac 下为Python函数添加超时时间

时间:2025-11-05 15:58:13 出处:IT科技阅读(143)

 我们在使用 requests 这类网络请求第三方库时,函数可以看到它有一个参数叫做timeout,添加就是时间指在网络请求发出开始计算,如果超过 timeout 还没有收到返回,函数就抛出超时异常。添加(当然存在特殊情况timeout 会失效,时间请看Timeouts and 函数cancellation for humans*[1] 这篇文章中作者的举例,我们不考虑这种特殊情况)。添加

但大家有没有考虑过,时间如何为普通的函数函数设置超时时间?特别是在运行一些数据处理、AI 相关的添加代码时,某个函数可能会运行很长时间,时间我们想实现,函数在函数运行超过特定的添加时间时,自动报错。时间

例如有这样一个场景,我写了一个函数calc_statistic(datas),根据用户传入的数据计算某个值。但如果用户传入的高防服务器数据非常大,这个函数就可能运行很长时间。我想设置让这个函数最多运行10秒钟。如果10秒还没有运行完成,就报错。应该怎么办呢?

如果你的电脑操作系统是 Linux 或者 macOS,那么 可以使用 signal 来解决。

在公众号前几天的文章中,我们介绍了使用signal来接管键盘的中断信号:《一日一技:在 Python 中接管键盘中断信号》,用到的是signal.SIGINT。今天我们要用到的是signal.SIGALRM。

首先我们来看看这个信号的使用方法:

import time import signal def 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秒到了以后,b2b信息网函数handler被运行。在函数中抛出了一个异常,导致程序结束。clac_statistic函数原本要运行100秒,但是在10秒以后就停止了,从而实现了函数的超时功能。

基于以上原理,我们实现一个装饰器,来简化为不同函数设置超时功能:

import time import signal class FuncTimeoutException(Exception):     pass def 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 decorator signal.signal(signal.SIGALRM, handler) 

我们来试一试测试一下这个函数超时装饰器。首先测试函数的运行时间小于超时时间时,程序正常运行没有问题:

再来测试一下函数运行时间超过超时时间的情况:

正常抛出FuncTimeoutException异常。

那我们在实际使用中,可以使用try...except FuncTimeoutException捕获这个异常,然后实现自定义的处理流程,例如:

try:     clac_statistic(100) except FuncTimeException:     print(该函数运行超时,运行自定义的处理流程) 

当然你如果想直接跳过这个异常也没问题,参考《一日一技:不使用 try...except 掩盖一些已知异常》:

import contextlib: with contextlib.supress(FuncTimeException):     clac_statistic(100) 亿华云计算

分享到:

上一篇:小米Note更换听筒的详细教程(一步步教你如何更换小米Note的听筒)

下一篇:Chrony是一个开源的自由软件,它能帮助你保持系统时钟与时钟服务器(NTP)同步,因此让你的时间保持精确。它由两个程序组成,分别是chronyd和chronyc。chronyd是一个后台运行的守护进程,用于调整内核中运行的系统时钟和时钟服务器同步。它确定计算机增减时间的比率,并对此进行补偿。chronyc提供了一个用户界面,用于监控性能并进行多样化的配置。它可以在chronyd实例控制的计算机上工作,也可以在一台不同的远程计算机上工作。在像CentOS 7之类基于RHEL的操作系统上,已经默认安装有Chrony。Chrony配置当Chrony启动时,它会读取/etc/chrony.conf配置文件中的设置。CentOS 7操作系统上最重要的设置有:server - 该参数可以多次用于添加时钟服务器,必须以server 格式使用。一般而言,你想添加多少服务器,就可以添加多少服务器。复制代码代码如下:server 0.centos.pool.ntp.org server 3.europe.pool.ntp.orgstratumweight - stratumweight指令设置当chronyd从可用源中选择同步源时,每个层应该添加多少距离到同步距离。默认情况下,CentOS中设置为0,让chronyd在选择源时忽略源的层级。driftfile - chronyd程序的主要行为之一,就是根据实际时间计算出计算机增减时间的比率,将它记录到一个文件中是最合理的,它会在重启后为系统时钟作出补偿,甚至可能的话,会从时钟服务器获得较好的估值。rtcsync - rtcsync指令将启用一个内核模式,在该模式中,系统时间每11分钟会拷贝到实时时钟(RTC)。allow / deny - 这里你可以指定一台主机、子网,或者网络以允许或拒绝NTP连接到扮演时钟服务器的机器。复制代码代码如下:allow 192.168.4.5 deny 192.168/16cmdallow / cmddeny - 跟上面相类似,只是你可以指定哪个IP地址或哪台主机可以通过chronyd使用控制命令bindcmdaddress - 该指令允许你限制chronyd监听哪个网络接口的命令包(由chronyc执行)。该指令通过cmddeny机制提供了一个除上述限制以外可用的额外的访问控制等级。复制代码代码如下:bindcmdaddress 127.0.0.1 bindcmdaddress ::1makestep - 通常,chronyd将根据需求通过减慢或加速时钟,使得系统逐步纠正所有时间偏差。在某些特定情况下,系统时钟可能会漂移过快,导致该调整过程消耗很长的时间来纠正系统时钟。该指令强制chronyd在调整期大于某个阀值时步进调整系统时钟,但只有在因为chronyd启动时间超过指定限制(可使用负值来禁用限制),没有更多时钟更新时才生效。使用chronyc你也可以通过运行chronyc命令来修改设置,命令如下:accheck - 检查NTP访问是否对特定主机可用activity - 该命令会显示有多少NTP源在线/离线add server - 手动添加一台新的NTP服务器。clients - 在客户端报告已访问到服务器delete - 手动移除NTP服务器或对等服务器settime - 手动设置守护进程时间tracking - 显示系统时间信息你可以通过使用帮助命令查看完整的命令列表:

温馨提示:以上内容和图片整理于网络,仅供参考,希望对您有帮助!如有侵权行为请联系删除!

友情链接: